From: Xuehan Xu Date: Wed, 30 Nov 2022 03:55:39 +0000 (+0800) Subject: crimson/os/seastore: reclaim storage resources when removing onode X-Git-Tag: v18.1.0~384^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=36ae9c8e1b8f5cea51e36a203806f69d0721db8d;p=ceph.git crimson/os/seastore: reclaim storage resources when removing onode Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index f320e424ed93..912332d0cd31 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -1074,6 +1074,9 @@ ObjectDataHandler::clear_ret ObjectDataHandler::clear( ctx.t, object_data.get_reserved_data_base(), object_data.get_reserved_data_len()); + if (object_data.is_null()) { + return clear_iertr::now(); + } return trim_data_reservation(ctx, object_data, 0); }); } diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 0cac0cad1a16..e6e984ceb017 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -1139,6 +1139,7 @@ SeaStore::tm_ret SeaStore::_do_transaction_step( switch (op->op) { case Transaction::OP_REMOVE: { + TRACET("removing {}", *ctx.transaction, i.get_oid(op->oid)); return _remove(ctx, onodes[op->oid]); } case Transaction::OP_CREATE: @@ -1266,7 +1267,40 @@ SeaStore::tm_ret SeaStore::_remove( { LOG_PREFIX(SeaStore::_remove); DEBUGT("onode={}", *ctx.transaction, *onode); - return onode_manager->erase_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( + BtreeOMapManager(*transaction_manager), + onode->get_layout().omap_root.get( + onode->get_metadata_hint(device->get_block_size())), + [&ctx, onode](auto &omap_manager, auto &omap_root) { + return omap_manager.omap_clear( + omap_root, + *ctx.transaction + ); + }); + } + return fut.si_then([this, &ctx, onode] { + return seastar::do_with( + ObjectDataHandler(max_object_size), + [=, this, &ctx](auto &objhandler) { + return objhandler.clear( + ObjectDataHandler::context_t{ + *transaction_manager, + *ctx.transaction, + *onode, + }); + }); + }).si_then([this, &ctx, onode]() mutable { + return onode_manager->erase_onode(*ctx.transaction, onode); + }).handle_error_interruptible( + crimson::ct_error::input_output_error::pass_further(), + crimson::ct_error::assert_all( + "Invalid error in SeaStore::_remove" + ) + ); } SeaStore::tm_ret SeaStore::_touch(