From: Xuehan Xu Date: Tue, 27 Feb 2024 08:27:58 +0000 (+0800) Subject: crimson/os/seastore: also remove xattrs when removing onodes X-Git-Tag: v20.0.0~2527^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=8cc25049a897ebafccd2b9bded6d09300575ef2c;p=ceph.git crimson/os/seastore: also remove xattrs when removing onodes Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 8363b14803336..a2ccd3bd17709 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -1480,28 +1480,49 @@ SeaStore::Shard::_do_transaction_step( } SeaStore::Shard::tm_ret -SeaStore::Shard::_remove( +SeaStore::Shard::_remove_omaps( internal_context_t &ctx, - OnodeRef &onode) + OnodeRef &onode, + omap_root_t &&omap_root) { - LOG_PREFIX(SeaStore::_remove); - DEBUGT("onode={}", *ctx.transaction, *onode); - auto fut = BtreeOMapManager::omap_clear_iertr::now(); - auto omap_root = onode->get_layout().omap_root.get( - onode->get_metadata_hint(device->get_block_size())); if (omap_root.get_location() != L_ADDR_NULL) { - fut = seastar::do_with( + return seastar::do_with( BtreeOMapManager(*transaction_manager), - onode->get_layout().omap_root.get( - onode->get_metadata_hint(device->get_block_size())), + std::move(omap_root), [&ctx, onode](auto &omap_manager, auto &omap_root) { return omap_manager.omap_clear( omap_root, *ctx.transaction + ).handle_error_interruptible( + crimson::ct_error::input_output_error::pass_further(), + crimson::ct_error::assert_all{ + "Invalid error in SeaStore::_remove" + } ); }); } - return fut.si_then([this, &ctx, onode] { + return tm_iertr::now(); +} + +SeaStore::Shard::tm_ret +SeaStore::Shard::_remove( + internal_context_t &ctx, + OnodeRef &onode) +{ + LOG_PREFIX(SeaStore::_remove); + DEBUGT("onode={}", *ctx.transaction, *onode); + return _remove_omaps( + ctx, + onode, + onode->get_layout().omap_root.get( + onode->get_metadata_hint(device->get_block_size())) + ).si_then([this, &ctx, onode]() mutable { + return _remove_omaps( + ctx, + onode, + onode->get_layout().xattr_root.get( + onode->get_metadata_hint(device->get_block_size()))); + }).si_then([this, &ctx, onode] { return seastar::do_with( ObjectDataHandler(max_object_size), [=, this, &ctx](auto &objhandler) { diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index bff0092f45332..79f0bb82e12c7 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -343,6 +343,10 @@ public: std::vector &d_onodes, ceph::os::Transaction::iterator &i); + tm_ret _remove_omaps( + internal_context_t &ctx, + OnodeRef &onode, + omap_root_t &&omap_root); tm_ret _remove( internal_context_t &ctx, OnodeRef &onode);