"Small writes into unused portion of existing blob");
b.add_u64_counter(l_bluestore_write_deferred,
"bluestore_write_deferred",
- "Overwrites using deferred");
+ "Total deferred writes submitted");
+ b.add_u64_counter(l_bluestore_write_deferred_bytes,
+ "bluestore_write_deferred_bytes",
+ "Total bytes submitted as deferred writes");
b.add_u64_counter(l_bluestore_write_small_pre_read,
"bluestore_write_small_pre_read",
"Small writes that required we read some data (possibly "
#endif
bluestore_deferred_op_t *BlueStore::_get_deferred_op(
- TransContext *txc)
+ TransContext *txc, uint64_t len)
{
if (!txc->deferred_txn) {
txc->deferred_txn = new bluestore_deferred_transaction_t;
}
txc->deferred_txn->ops.push_back(bluestore_deferred_op_t());
+ logger->inc(l_bluestore_write_deferred);
+ logger->inc(l_bluestore_write_deferred_bytes, len);
return &txc->deferred_txn->ops.back();
}
if (b_len < prefer_deferred_size) {
dout(20) << __func__ << " deferring small 0x" << std::hex
<< b_len << std::dec << " unused write via deferred" << dendl;
- bluestore_deferred_op_t *op = _get_deferred_op(txc);
+ bluestore_deferred_op_t *op = _get_deferred_op(txc, bl.length());
op->op = bluestore_deferred_op_t::OP_WRITE;
b->get_blob().map(
b_off, b_len,
return 0;
});
op->data = bl;
- logger->inc(l_bluestore_write_deferred);
} else {
b->get_blob().map_bl(
b_off, bl,
b->dirty_blob().calc_csum(b_off, bl);
if (!g_conf()->bluestore_debug_omit_block_device_write) {
- bluestore_deferred_op_t *op = _get_deferred_op(txc);
+ bluestore_deferred_op_t *op = _get_deferred_op(txc, bl.length());
op->op = bluestore_deferred_op_t::OP_WRITE;
int r = b->get_blob().map(
b_off, b_len,
b->dirty_blob().mark_used(le->blob_offset, le->length);
txc->statfs_delta.stored() += le->length;
dout(20) << __func__ << " lex " << *le << dendl;
- logger->inc(l_bluestore_write_deferred);
return;
}
// try to reuse blob if we can
txc->statfs_delta.stored() += le->length;
if (!g_conf()->bluestore_debug_omit_block_device_write) {
- bluestore_deferred_op_t* op = _get_deferred_op(txc);
+ bluestore_deferred_op_t* op = _get_deferred_op(txc, bl.length());
op->op = bluestore_deferred_op_t::OP_WRITE;
op->extents.swap(dctx.res_extents);
op->data = std::move(bl);
if (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);
+ bluestore_deferred_op_t *op = _get_deferred_op(txc, l->length());
op->op = bluestore_deferred_op_t::OP_WRITE;
int r = wi.b->get_blob().map(
b_off, l->length(),
});
ceph_assert(r == 0);
op->data = *l;
- logger->inc(l_bluestore_write_deferred);
} else {
wi.b->get_blob().map_bl(
b_off, *l,
l_bluestore_write_small_bytes,
l_bluestore_write_small_unused,
l_bluestore_write_deferred,
+ l_bluestore_write_deferred_bytes,
l_bluestore_write_small_pre_read,
l_bluestore_write_new,
l_bluestore_txc,
void _zoned_clean_zone(uint64_t zone_num);
#endif
- bluestore_deferred_op_t *_get_deferred_op(TransContext *txc);
+ bluestore_deferred_op_t *_get_deferred_op(TransContext *txc, uint64_t len);
void _deferred_queue(TransContext *txc);
public:
void deferred_try_submit();
ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 2u);
ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 0u);
ASSERT_EQ(logger->get(l_bluestore_write_deferred), 0u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 0);
}
logger->reset();
ASSERT_EQ(logger->get(l_bluestore_write_big_bytes), bl.length());
ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 4u);
ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 2u);
- ASSERT_EQ(logger->get(l_bluestore_write_deferred), 2u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred), 4u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 2 * 65536);
}
{
ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 64u);
ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 0u);
ASSERT_EQ(logger->get(l_bluestore_write_deferred), 0u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 0u);
}
{
ObjectStore::Transaction t;
CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
r = queue_transaction(store, ch, std::move(t));
++exp_bluestore_write_big;
- if (expected_write_size != prefer_deferred_size)
+ if (expected_write_size < prefer_deferred_size)
++exp_bluestore_write_big_deferred;
ASSERT_EQ(r, 0);
}