OPTION(bluestore_bluefs_gift_ratio, OPT_FLOAT) // how much to add at a time
OPTION(bluestore_bluefs_reclaim_ratio, OPT_FLOAT) // how much to reclaim at a time
OPTION(bluestore_bluefs_balance_interval, OPT_FLOAT) // how often (sec) to balance free space between bluefs and bluestore
+// how often (sec) to dump allocation failure happened during bluefs rebalance
+OPTION(bluestore_bluefs_balance_failure_dump_interval, OPT_FLOAT)
+
// If you want to use spdk driver, you need to specify NVMe serial number here
// with "spdk:" prefix.
// Users can use 'lspci -vvv -d 8086:0953 | grep "Device Serial Number"' to
.set_default(1)
.set_description("How frequently (in seconds) to balance free space between BlueFS and BlueStore"),
+ Option("bluestore_bluefs_balance_failure_dump_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(0)
+ .set_description("How frequently (in seconds) to dump information on "
+ "allocation failure occurred during BlueFS space rebalance"),
+
Option("bluestore_spdk_mem", Option::TYPE_UINT, Option::LEVEL_DEV)
.set_default(512)
.set_description("Amount of dpdk memory size in MB")
return 0;
}
+void BlueStore::_dump_alloc_on_rebalance_failure()
+{
+ auto dump_interval =
+ cct->_conf->bluestore_bluefs_balance_failure_dump_interval;
+ if (dump_interval > 0 &&
+ next_dump_on_bluefs_balance_failure <= ceph_clock_now()) {
+ alloc->dump();
+ next_dump_on_bluefs_balance_failure = ceph_clock_now();
+ next_dump_on_bluefs_balance_failure += dump_interval;
+ }
+}
+
int BlueStore::_balance_bluefs_freespace(PExtentVector *extents)
{
int ret = 0;
0, 0, extents);
if (alloc_len <= 0) {
- dout(1) << __func__ << " no allocate on 0x" << std::hex << gift
+ dout(0) << __func__ << " no allocate on 0x" << std::hex << gift
<< " min_alloc_size 0x" << min_alloc_size << std::dec << dendl;
alloc->unreserve(gift);
- alloc->dump();
+ _dump_alloc_on_rebalance_failure();
return 0;
} else if (alloc_len < (int64_t)gift) {
- dout(1) << __func__ << " insufficient allocate on 0x" << std::hex << gift
+ dout(0) << __func__ << " insufficient allocate on 0x" << std::hex << gift
<< " min_alloc_size 0x" << min_alloc_size
<< " allocated 0x" << alloc_len
<< std::dec << dendl;
alloc->unreserve(gift - alloc_len);
- alloc->dump();
+ _dump_alloc_on_rebalance_failure();
}
for (auto& e : *extents) {
dout(1) << __func__ << " gifting " << e << " to bluefs" << dendl;
unsigned bluefs_shared_bdev = 0; ///< which bluefs bdev we are sharing
bool bluefs_single_shared_device = true;
utime_t bluefs_last_balance;
+ utime_t next_dump_on_bluefs_balance_failure;
KeyValueDB *db = nullptr;
BlockDevice *bdev = nullptr;
void _open_statfs();
+ void _dump_alloc_on_rebalance_failure();
int _reconcile_bluefs_freespace();
int _balance_bluefs_freespace(PExtentVector *extents);
void _commit_bluefs_freespace(const PExtentVector& extents);