From 99a25b382232f4d3e692df7c35e06574e53cfba3 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 10 Jan 2025 22:46:43 +0000 Subject: [PATCH] crimson/.../replicated_recovery_backend: convert prep_push_target to coroutine Signed-off-by: Samuel Just --- .../osd/replicated_recovery_backend.cc | 50 ++++++++++--------- src/crimson/osd/replicated_recovery_backend.h | 2 +- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 154b56af336ac..85b8c8413cb28 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -1189,13 +1189,12 @@ ReplicatedRecoveryBackend::prep_push_target( bool clear_omap, ObjectStore::Transaction* t, const map>& attrs, - bufferlist&& omap_header) + bufferlist omap_header) { LOG_PREFIX(ReplicatedRecoveryBackend::prep_push_target); if (!first) { - return seastar::make_ready_future( - get_temp_recovery_object(recovery_info.soid, - recovery_info.version)); + co_return get_temp_recovery_object(recovery_info.soid, + recovery_info.version); } ghobject_t target_oid; @@ -1209,6 +1208,7 @@ ReplicatedRecoveryBackend::prep_push_target( pg, target_oid); add_temp_obj(target_oid.hobj); } + // create a new object if (!complete || !recovery_info.object_exist) { t->remove(coll->get_cid(), target_oid); @@ -1220,6 +1220,7 @@ ReplicatedRecoveryBackend::prep_push_target( oi.expected_write_size, oi.alloc_hint_flags); } + if (complete) { // remove xattr and update later if overwrite on original object t->rmattrs(coll->get_cid(), target_oid); @@ -1233,29 +1234,30 @@ ReplicatedRecoveryBackend::prep_push_target( t->omap_setheader(coll->get_cid(), target_oid, omap_header); } if (complete || !recovery_info.object_exist) { - return seastar::make_ready_future(target_oid.hobj); + co_return target_oid.hobj; } + // clone overlap content in local object if using a new object - return interruptor::make_interruptible(store->stat(coll, ghobject_t(recovery_info.soid))) - .then_interruptible( - [FNAME, this, &recovery_info, t, target_oid] (auto st) { - // TODO: pg num bytes counting - uint64_t local_size = std::min(recovery_info.size, (uint64_t)st.st_size); - interval_set local_intervals_included, local_intervals_excluded; - if (local_size) { - local_intervals_included.insert(0, local_size); - local_intervals_excluded.intersection_of(local_intervals_included, recovery_info.copy_subset); - local_intervals_included.subtract(local_intervals_excluded); - } - for (auto [off, len] : local_intervals_included) { - DEBUGDPP("clone_range {} {}~{}", - pg, recovery_info.soid, off, len); - t->clone_range(coll->get_cid(), ghobject_t(recovery_info.soid), - target_oid, off, len, off); - } - return seastar::make_ready_future(target_oid.hobj); - }); + auto st = co_await interruptor::make_interruptible( + store->stat(coll, ghobject_t(recovery_info.soid))); + + // TODO: pg num bytes counting + uint64_t local_size = std::min(recovery_info.size, (uint64_t)st.st_size); + interval_set local_intervals_included, local_intervals_excluded; + if (local_size) { + local_intervals_included.insert(0, local_size); + local_intervals_excluded.intersection_of(local_intervals_included, recovery_info.copy_subset); + local_intervals_included.subtract(local_intervals_excluded); + } + for (auto [off, len] : local_intervals_included) { + DEBUGDPP("clone_range {} {}~{}", + pg, recovery_info.soid, off, len); + t->clone_range(coll->get_cid(), ghobject_t(recovery_info.soid), + target_oid, off, len, off); + } + co_return target_oid.hobj; } + RecoveryBackend::interruptible_future<> ReplicatedRecoveryBackend::submit_push_data( const ObjectRecoveryInfo &recovery_info, diff --git a/src/crimson/osd/replicated_recovery_backend.h b/src/crimson/osd/replicated_recovery_backend.h index adf7188c89185..85556044fab29 100644 --- a/src/crimson/osd/replicated_recovery_backend.h +++ b/src/crimson/osd/replicated_recovery_backend.h @@ -178,7 +178,7 @@ private: bool clear_omap, ObjectStore::Transaction* t, const std::map> &attrs, - bufferlist&& omap_header); + bufferlist omap_header); using interruptor = crimson::interruptible::interruptor< crimson::osd::IOInterruptCondition>; }; -- 2.39.5