From: Zhang Song Date: Wed, 11 Jun 2025 04:04:25 +0000 (+0800) Subject: crimson/os/seastore: reserve region in LBABtree when touching onode X-Git-Tag: v21.0.1~152^2~17 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1ff54b89390002b863a80f917473fca944ca215b;p=ceph.git crimson/os/seastore: reserve region in LBABtree when touching onode Signed-off-by: Zhang Song 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 a9932b0dbd8..7cca29f93be 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -409,8 +409,9 @@ ObjectDataHandler::clone_ret do_clonerange( data.merge_tail(ctx.tm.get_block_size()); auto extents = co_await ctx.tm.alloc_data_extents( ctx.t, - (overwrite_range.aligned_end - ctx.tm.get_block_size() - ).checked_to_laddr(), + laddr_hint_t::create_as_fixed( + (overwrite_range.aligned_end - ctx.tm.get_block_size() + ).checked_to_laddr()), ctx.tm.get_block_size(), std::move(write_pos) ).handle_error_interruptible( @@ -1379,6 +1380,16 @@ ObjectDataHandler::zero_ret ObjectDataHandler::zero( }); } +ObjectDataHandler::touch_ret +ObjectDataHandler::touch(context_t ctx) +{ + return with_object_data(ctx, [this, ctx](auto &obj_data) { + return prepare_data_reservation( + ctx, obj_data, max_object_size + ).discard_result(); + }); +} + ObjectDataHandler::write_ret ObjectDataHandler::write( context_t ctx, objaddr_t offset, diff --git a/src/crimson/os/seastore/object_data_handler.h b/src/crimson/os/seastore/object_data_handler.h index 73c0953668a..49b7804dd9d 100644 --- a/src/crimson/os/seastore/object_data_handler.h +++ b/src/crimson/os/seastore/object_data_handler.h @@ -346,6 +346,10 @@ public: Onode *d_onode = nullptr; // The desination node in case of clone }; + using touch_iertr = base_iertr; + using touch_ret = touch_iertr::future<>; + touch_ret touch(context_t ctx); + /// Writes bl to [offset, offset + bl.length()) using write_iertr = base_iertr; using write_ret = write_iertr::future<>; diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 02c4d952652..638e061e96b 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -2140,7 +2140,12 @@ SeaStore::Shard::_touch( internal_context_t &ctx, Onode &onode) { - return tm_iertr::now(); + auto objhandler = ObjectDataHandler(max_object_size); + co_await objhandler.touch(ObjectDataHandler::context_t{ + *transaction_manager, + *ctx.transaction, + onode + }); } SeaStore::Shard::tm_ret