From: Samuel Just Date: Fri, 10 Jan 2025 22:50:14 +0000 (+0000) Subject: crimson/.../replicated_recovery_backend: convert submit_push_data to coroutine X-Git-Tag: v20.0.0~282^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=08ca60ef32e7b4ada2e709f7ceb498f336c40062;p=ceph.git crimson/.../replicated_recovery_backend: convert submit_push_data to coroutine Signed-off-by: Samuel Just --- diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 85b8c8413cb2..3e3361edb5d3 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -1264,72 +1264,62 @@ ReplicatedRecoveryBackend::submit_push_data( bool first, bool complete, bool clear_omap, - interval_set&& data_zeros, - interval_set&& intervals_included, - bufferlist&& data_included, - bufferlist&& omap_header, + interval_set data_zeros, + interval_set intervals_included, + bufferlist data_included, + bufferlist omap_header, const map> &attrs, - map&& omap_entries, + map omap_entries, ObjectStore::Transaction *t) { LOG_PREFIX(ReplicatedRecoveryBackend::submit_push_data); DEBUGDPP("", pg); - return prep_push_target(recovery_info, first, complete, - clear_omap, t, attrs, - std::move(omap_header)).then_interruptible( - [FNAME, this, - &recovery_info, t, - first, complete, - data_zeros=std::move(data_zeros), - intervals_included=std::move(intervals_included), - data_included=std::move(data_included), - omap_entries=std::move(omap_entries), - &attrs](auto target_oid) mutable { - - uint32_t fadvise_flags = CEPH_OSD_OP_FLAG_FADVISE_SEQUENTIAL; - // Punch zeros for data, if fiemap indicates nothing but it is marked dirty - if (!data_zeros.empty()) { - data_zeros.intersection_of(recovery_info.copy_subset); - assert(intervals_included.subset_of(data_zeros)); - data_zeros.subtract(intervals_included); - - DEBUGDPP("recovering object {} copy_subset: {} " - "intervals_included: {} data_zeros: {}", - pg, recovery_info.soid, recovery_info.copy_subset, - intervals_included, data_zeros); - - for (auto [start, len] : data_zeros) { - t->zero(coll->get_cid(), ghobject_t(target_oid), start, len); - } - } - uint64_t off = 0; - for (auto [start, len] : intervals_included) { - bufferlist bit; - bit.substr_of(data_included, off, len); - t->write(coll->get_cid(), ghobject_t(target_oid), - start, len, bit, fadvise_flags); - off += len; + auto target_oid = co_await prep_push_target( + recovery_info, first, complete, + clear_omap, t, attrs, + std::move(omap_header)); + + uint32_t fadvise_flags = CEPH_OSD_OP_FLAG_FADVISE_SEQUENTIAL; + // Punch zeros for data, if fiemap indicates nothing but it is marked dirty + if (!data_zeros.empty()) { + data_zeros.intersection_of(recovery_info.copy_subset); + assert(intervals_included.subset_of(data_zeros)); + data_zeros.subtract(intervals_included); + + DEBUGDPP("recovering object {} copy_subset: {} " + "intervals_included: {} data_zeros: {}", + pg, recovery_info.soid, recovery_info.copy_subset, + intervals_included, data_zeros); + + for (auto [start, len] : data_zeros) { + t->zero(coll->get_cid(), ghobject_t(target_oid), start, len); } + } + uint64_t off = 0; + for (auto [start, len] : intervals_included) { + bufferlist bit; + bit.substr_of(data_included, off, len); + t->write(coll->get_cid(), ghobject_t(target_oid), + start, len, bit, fadvise_flags); + off += len; + } - if (!omap_entries.empty()) - t->omap_setkeys(coll->get_cid(), ghobject_t(target_oid), omap_entries); - if (!attrs.empty()) - t->setattrs(coll->get_cid(), ghobject_t(target_oid), attrs); + if (!omap_entries.empty()) + t->omap_setkeys(coll->get_cid(), ghobject_t(target_oid), omap_entries); + if (!attrs.empty()) + t->setattrs(coll->get_cid(), ghobject_t(target_oid), attrs); - if (complete) { - if (!first) { - DEBUGDPP("Removing oid {} from the temp collection", - pg, target_oid); - clear_temp_obj(target_oid); - t->remove(coll->get_cid(), ghobject_t(recovery_info.soid)); - t->collection_move_rename(coll->get_cid(), ghobject_t(target_oid), - coll->get_cid(), ghobject_t(recovery_info.soid)); - } - submit_push_complete(recovery_info, t); + if (complete) { + if (!first) { + DEBUGDPP("Removing oid {} from the temp collection", + pg, target_oid); + clear_temp_obj(target_oid); + t->remove(coll->get_cid(), ghobject_t(recovery_info.soid)); + t->collection_move_rename(coll->get_cid(), ghobject_t(target_oid), + coll->get_cid(), ghobject_t(recovery_info.soid)); } - DEBUGDPP("done", pg); - return seastar::make_ready_future<>(); - }); + submit_push_complete(recovery_info, t); + } } void ReplicatedRecoveryBackend::submit_push_complete( diff --git a/src/crimson/osd/replicated_recovery_backend.h b/src/crimson/osd/replicated_recovery_backend.h index 85556044fab2..eef312425db5 100644 --- a/src/crimson/osd/replicated_recovery_backend.h +++ b/src/crimson/osd/replicated_recovery_backend.h @@ -93,12 +93,12 @@ protected: bool first, bool complete, bool clear_omap, - interval_set&& data_zeros, - interval_set&& intervals_included, - ceph::bufferlist&& data_included, - ceph::bufferlist&& omap_header, + interval_set data_zeros, + interval_set intervals_included, + ceph::bufferlist data_included, + ceph::bufferlist omap_header, const std::map> &attrs, - std::map&& omap_entries, + std::map omap_entries, ceph::os::Transaction *t); void submit_push_complete( const ObjectRecoveryInfo &recovery_info,