return 0;
}
-void BlueFS::_add_block_extent(unsigned id, uint64_t offset, uint64_t length)
+void BlueFS::_add_block_extent(unsigned id, uint64_t offset, uint64_t length,
+ bool skip)
{
dout(1) << __func__ << " bdev " << id
<< " 0x" << std::hex << offset << "~" << length << std::dec
+ << " skip " << skip
<< dendl;
ceph_assert(id < bdev.size());
block_all[id].insert(offset, length);
if (id < alloc.size() && alloc[id]) {
- log_t.op_alloc_add(id, offset, length);
+ if (!skip)
+ log_t.op_alloc_add(id, offset, length);
+
alloc[id]->init_add_free(offset, length);
}
}
auto owned = get_total(i);
auto free = get_free(i);
+
out << i << " : device size 0x" << std::hex << bdev[i]->get_size()
<< " : own 0x" << block_all[i]
<< " = 0x" << owned
<< " : using 0x" << owned - free
- << std::dec << "(" << byte_u_t(owned - free) << ")"
- << "\n";
+ << std::dec << "(" << byte_u_t(owned - free) << ")";
+ if (i == _get_slow_device_id()) {
+ ceph_assert(slow_dev_expander);
+ ceph_assert(alloc[i]);
+ free = slow_dev_expander->available_freespace(alloc_size[i]);
+ out << std::hex
+ << " : bluestore has 0x" << free
+ << std::dec << "(" << byte_u_t(free) << ") available";
+ }
+ out << "\n";
}
}
return 0;
}
-void BlueFS::umount()
+void BlueFS::umount(bool avoid_compact)
{
dout(1) << __func__ << dendl;
- sync_metadata();
+ sync_metadata(avoid_compact);
_close_writer(log_writer);
log_writer = NULL;
{
int r = -ENOSPC;
if (slow_dev_expander) {
- int id = _get_slow_device_id();
+ auto id = _get_slow_device_id();
auto min_alloc_size = alloc_size[id];
- ceph_assert(id <= (int)alloc.size() && alloc[id]);
+ ceph_assert(id <= alloc.size() && alloc[id]);
auto min_need = round_up_to(need, min_alloc_size);
need = std::max(need,
slow_dev_expander->get_recommended_expansion_delta(
return 0;
}
-void BlueFS::sync_metadata()
+void BlueFS::sync_metadata(bool avoid_compact)
{
std::unique_lock l(lock);
if (log_t.empty() && dirty_files.empty()) {
dout(10) << __func__ << " done in " << (ceph_clock_now() - start) << dendl;
}
- if (_should_compact_log()) {
+ if (!avoid_compact && _should_compact_log()) {
if (cct->_conf->bluefs_compact_log_sync) {
_compact_log_sync();
} else {