OPTION(bluestore_debug_misc, OPT_BOOL)
OPTION(bluestore_debug_no_reuse_blocks, OPT_BOOL)
OPTION(bluestore_debug_small_allocations, OPT_INT)
+OPTION(bluestore_debug_too_many_blobs_threshold, OPT_INT)
OPTION(bluestore_debug_freelist, OPT_BOOL)
OPTION(bluestore_debug_prefill, OPT_FLOAT)
OPTION(bluestore_debug_prefragment_max, OPT_INT)
.set_default(0)
.set_description(""),
+ Option("bluestore_debug_too_many_blobs_threshold", Option::TYPE_INT, Option::LEVEL_DEV)
+ .set_default(24*1024)
+ .set_description(""),
+
Option("bluestore_debug_freelist", Option::TYPE_BOOL, Option::LEVEL_DEV)
.set_default(false)
.set_description(""),
shard_end = sp->offset;
}
Extent dummy(needs_reshard_begin);
+ bool was_too_many_dump = false;
+ auto too_many_blobs_threshold =
+ g_conf()->bluestore_debug_too_many_blobs_threshold;
for (auto e = extent_map.lower_bound(dummy); e != extent_map.end(); ++e) {
if (e->logical_offset >= needs_reshard_end) {
break;
b->id = bid;
spanning_blob_map[b->id] = b;
dout(20) << __func__ << " adding spanning " << *b << dendl;
+ if (!was_too_many_dump &&
+ too_many_blobs_threshold &&
+ spanning_blob_map.size() >= size_t(too_many_blobs_threshold)) {
+ dout(0) << __func__
+ << " spanning blob count exceeds threshold, "
+ << spanning_blob_map.size() << " spanning blobs"
+ << dendl;
+ _dump_onode<0>(cct, *onode);
+ was_too_many_dump = true;
+ }
}
}
} else {