dout(20) << __func__ << " prealloc " << prealloc << dendl;
auto prealloc_pos = prealloc.begin();
+ ceph_assert(prealloc_pos != prealloc.end());
+ uint64_t prealloc_pos_length = prealloc_pos->length;
for (auto& wi : wctx->writes) {
bluestore_blob_t& dblob = wi.b->dirty_blob();
PExtentVector extents;
int64_t left = final_length;
+ bool deferred_region_small = false;
while (left > 0) {
ceph_assert(prealloc_left > 0);
+ deferred_region_small |= (prealloc_pos_length <= prefer_deferred_size.load());
if (prealloc_pos->length <= left) {
prealloc_left -= prealloc_pos->length;
left -= prealloc_pos->length;
txc->statfs_delta.allocated() += prealloc_pos->length;
extents.push_back(*prealloc_pos);
++prealloc_pos;
+ if (prealloc_pos != prealloc.end()) {
+ prealloc_pos_length = prealloc_pos->length;
+ }
} else {
extents.emplace_back(prealloc_pos->offset, left);
prealloc_pos->offset += left;
// queue io
if (!g_conf()->bluestore_debug_omit_block_device_write) {
- if (l->length() < prefer_deferred_size.load()) {
+ if (deferred_region_small && l->length() < prefer_deferred_size.load()) {
dout(20) << __func__ << " deferring 0x" << std::hex
<< l->length() << std::dec << " write via deferred" << dendl;
bluestore_deferred_op_t *op = _get_deferred_op(txc, l->length());