From: Chunmei Liu Date: Thu, 24 Mar 2022 06:59:39 +0000 (-0700) Subject: crimson: add OP_OMAP_CLEAR support X-Git-Tag: v18.0.0~1164^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=019c4128cb6c074b655f8dd0c6dc26d58b11eab3;p=ceph.git crimson: add OP_OMAP_CLEAR support Signed-off-by: Chunmei Liu --- diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 81147963b2dc6..e6524a811f0dc 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -1153,6 +1153,10 @@ SeaStore::tm_ret SeaStore::_do_transaction_step( std::move(first), std::move(last)); } break; + case Transaction::OP_OMAP_CLEAR: + { + return _omap_clear(ctx, get_onode(op->oid)); + } case Transaction::OP_COLL_HINT: { ceph::bufferlist hint; @@ -1277,6 +1281,37 @@ SeaStore::tm_ret SeaStore::_omap_set_header( return tm_iertr::now(); } +SeaStore::tm_ret SeaStore::_omap_clear( + internal_context_t &ctx, + OnodeRef &onode) +{ + LOG_PREFIX(SeaStore::_omap_clear); + DEBUGT("{} {} keys", *ctx.transaction, *onode); + if (auto omap_root = onode->get_layout().omap_root.get( + onode->get_metadata_hint(segment_manager->get_block_size())); + omap_root.is_null()) { + return seastar::now(); + } else { + return seastar::do_with( + BtreeOMapManager(*transaction_manager), + onode->get_layout().omap_root.get( + onode->get_metadata_hint(segment_manager->get_block_size())), + [&ctx, &onode]( + auto &omap_manager, + auto &omap_root) { + return omap_manager.omap_clear( + omap_root, + *ctx.transaction) + .si_then([&] { + if (omap_root.must_update()) { + onode->get_mutable_layout(*ctx.transaction + ).omap_root.update(omap_root); + } + }); + }); + } +} + SeaStore::tm_ret SeaStore::_omap_rmkeys( internal_context_t &ctx, OnodeRef &onode, diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index 57c1d99891f53..d75b07a06defb 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -347,6 +347,9 @@ private: internal_context_t &ctx, OnodeRef &onode, ceph::bufferlist &&header); + tm_ret _omap_clear( + internal_context_t &ctx, + OnodeRef &onode); tm_ret _omap_rmkeys( internal_context_t &ctx, OnodeRef &onode,