From 26e61a02ec4e3a6d92af5ac8b4f1902244dd697f Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 4 Nov 2020 13:27:15 +0800 Subject: [PATCH] crimson/osd: extract read_omap_for_push_op() extract read_omap_for_push_op() out of build_push_op() for better readability Signed-off-by: Kefu Chai --- .../osd/replicated_recovery_backend.cc | 84 +++++++++++-------- src/crimson/osd/replicated_recovery_backend.h | 6 ++ 2 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 9e2707f72cc3b..03ffda209b6e5 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -426,40 +426,11 @@ seastar::future ReplicatedRecoveryBackend::build_push_op ); } return seastar::make_ready_future<>(); - }().then([this, &recovery_info] { - return shard_services.get_store().get_omap_iterator(coll, - ghobject_t(recovery_info.soid)); - }).then([&progress, &available, &new_progress, pop](auto iter) { - if (!progress.omap_complete) { - return iter->lower_bound(progress.omap_recovered_to).then( - [iter, &new_progress, pop, &available](int ret) { - return seastar::repeat([iter, &new_progress, pop, &available] { - if (!iter->valid()) { - new_progress.omap_complete = true; - return seastar::make_ready_future( - seastar::stop_iteration::yes); - } - if (!pop->omap_entries.empty() - && ((crimson::common::local_conf()->osd_recovery_max_omap_entries_per_chunk > 0 - && pop->omap_entries.size() - >= crimson::common::local_conf()->osd_recovery_max_omap_entries_per_chunk) - || available <= iter->key().size() + iter->value().length())) { - new_progress.omap_recovered_to = iter->key(); - return seastar::make_ready_future( - seastar::stop_iteration::yes); - } - pop->omap_entries.insert(make_pair(iter->key(), iter->value())); - if ((iter->key().size() + iter->value().length()) <= available) - available -= (iter->key().size() + iter->value().length()); - else - available = 0; - return iter->next().then([](int r) { - return seastar::stop_iteration::no; - }); - }); - }); - } - return seastar::make_ready_future<>(); + }().then([this, &recovery_info, &progress, &new_progress, &available, pop] { + return read_omap_for_push_op(recovery_info.soid, + progress, + new_progress, + available, pop); }).then([this, &recovery_info, &progress, &available, pop] { logger().debug("build_push_op: available: {}, copy_subset: {}", available, recovery_info.copy_subset); @@ -544,6 +515,51 @@ ReplicatedRecoveryBackend::read_object_for_push_op( })); } +seastar::future<> +ReplicatedRecoveryBackend::read_omap_for_push_op( + const hobject_t& oid, + const ObjectRecoveryProgress& progress, + ObjectRecoveryProgress& new_progress, + uint64_t max_len, + PushOp* push_op) +{ + return shard_services.get_store().get_omap_iterator(coll, ghobject_t{oid}) + .then([&progress, &new_progress, &max_len, push_op](auto omap_iter) { + if (progress.omap_complete) { + return seastar::make_ready_future<>(); + } + return omap_iter->lower_bound(progress.omap_recovered_to).then( + [omap_iter, &new_progress, &max_len, push_op](int ret) { + return seastar::repeat([omap_iter, &new_progress, &max_len, push_op] { + if (!omap_iter->valid()) { + new_progress.omap_complete = true; + return seastar::make_ready_future( + seastar::stop_iteration::yes); + } + unsigned entry_size = omap_iter->key().size() + omap_iter->value().length(); + if (!push_op->omap_entries.empty() && + ((crimson::common::local_conf()->osd_recovery_max_omap_entries_per_chunk > 0 && + (push_op->omap_entries.size() >= + crimson::common::local_conf()->osd_recovery_max_omap_entries_per_chunk)) || + max_len <= entry_size)) { + new_progress.omap_recovered_to = omap_iter->key(); + return seastar::make_ready_future( + seastar::stop_iteration::yes); + } + push_op->omap_entries.emplace(omap_iter->key(), omap_iter->value()); + if (entry_size >= max_len) { + max_len -= entry_size; + } else { + max_len = 0; + } + return omap_iter->next().then([](int r) { + return seastar::stop_iteration::no; + }); + }); + }); + }); +} + std::list::const_iterator> ReplicatedRecoveryBackend::get_shards_to_push(const hobject_t& soid) { diff --git a/src/crimson/osd/replicated_recovery_backend.h b/src/crimson/osd/replicated_recovery_backend.h index a224cb6da3e3b..4bb353c5aa0dc 100644 --- a/src/crimson/osd/replicated_recovery_backend.h +++ b/src/crimson/osd/replicated_recovery_backend.h @@ -134,4 +134,10 @@ private: uint64_t offset, uint64_t max_len, PushOp* push_op); + seastar::future<> read_omap_for_push_op( + const hobject_t& oid, + const ObjectRecoveryProgress& progress, + ObjectRecoveryProgress& new_progress, + uint64_t max_len, + PushOp* push_op); }; -- 2.39.5