From 6214d7c945b5d32222d83259740290bae75a8f33 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 21 Dec 2020 00:12:41 +0800 Subject: [PATCH] crimson/osd: extract read_metadata_for_push_op() out for better readability Signed-off-by: Kefu Chai --- .../osd/replicated_recovery_backend.cc | 82 +++++++++++-------- src/crimson/osd/replicated_recovery_backend.h | 10 +++ 2 files changed, 60 insertions(+), 32 deletions(-) diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 644c51eb9e120..c68661fffed28 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -352,44 +352,20 @@ seastar::future ReplicatedRecoveryBackend::build_push_op( logger().debug("{} {} @{}", __func__, recovery_info.soid, recovery_info.version); return seastar::do_with(ObjectRecoveryProgress(progress), - object_info_t(), uint64_t(crimson::common::local_conf() ->osd_recovery_max_chunk), eversion_t(), PushOp(), [this, &recovery_info, &progress, stat] - (auto& new_progress, auto& oi, auto& available, auto& v, auto& pop) { - return [this, &recovery_info, &progress, &new_progress, &oi, &v, pop=&pop] { - v = recovery_info.version; - if (progress.first) { - return seastar::when_all_succeed( - backend->omap_get_header(coll, ghobject_t(recovery_info.soid)).safe_then( - [&pop](auto bl) { - pop->omap_header.claim_append(bl); - }, crimson::os::FuturizedStore::read_errorator::all_same_way( - [] (const std::error_code& e) { - return seastar::make_exception_future<>(e); - })), - store->get_attrs(coll, ghobject_t(recovery_info.soid)).safe_then( - [&oi, pop, &v](auto attrs) mutable { - for (auto& [key, val] : attrs) { - pop->attrset[std::move(key)].push_back(std::move(val)); - } - logger().debug("build_push_op: {}", pop->attrset[OI_ATTR]); - oi.decode(pop->attrset[OI_ATTR]); - if (v == eversion_t()) { - v = oi.version; - } - }, crimson::os::FuturizedStore::read_errorator::all_same_way( - [] (const std::error_code& e) { - return seastar::make_exception_future<>(e); - })) - ).then_unpack([&new_progress] { - new_progress.first = false; - }); + (auto& new_progress, auto& available, auto& v, auto& pop) { + v = recovery_info.version; + return read_metadata_for_push_op(recovery_info.soid, + progress, new_progress, + v, &pop).then([&](eversion_t local_ver) mutable { + // If requestor didn't know the version, use ours + if (v == eversion_t()) { + v = local_ver; } - return seastar::make_ready_future<>(); - }().then([this, &recovery_info, &progress, &new_progress, &available, &pop]() mutable { return read_omap_for_push_op(recovery_info.soid, progress, new_progress, @@ -429,6 +405,48 @@ seastar::future ReplicatedRecoveryBackend::build_push_op( }); } +seastar::future +ReplicatedRecoveryBackend::read_metadata_for_push_op( + const hobject_t& oid, + const ObjectRecoveryProgress& progress, + ObjectRecoveryProgress& new_progress, + eversion_t ver, + PushOp* push_op) +{ + if (!progress.first) { + return seastar::make_ready_future(ver); + } + return seastar::when_all_succeed( + backend->omap_get_header(coll, ghobject_t(oid)).handle_error( + crimson::os::FuturizedStore::read_errorator::all_same_way( + [] (const std::error_code& e) { + return seastar::make_ready_future(); + })), + store->get_attrs(coll, ghobject_t(oid)).handle_error( + crimson::os::FuturizedStore::get_attrs_ertr::all_same_way( + [] (const std::error_code& e) { + return seastar::make_ready_future(); + })) + ).then_unpack([&new_progress, push_op](auto bl, auto attrs) { + if (bl.length() == 0) { + logger().error("read_metadata_for_push_op: fail to read omap header"); + return eversion_t{}; + } else if (attrs.empty()) { + logger().error("read_metadata_for_push_op: fail to read attrs"); + return eversion_t{}; + } + push_op->omap_header.claim_append(std::move(bl)); + for (auto&& [key, val] : std::move(attrs)) { + push_op->attrset[key].push_back(val); + } + logger().debug("read_metadata_for_push_op: {}", push_op->attrset[OI_ATTR]); + object_info_t oi; + oi.decode(push_op->attrset[OI_ATTR]); + new_progress.first = false; + return oi.version; + }); +} + seastar::future ReplicatedRecoveryBackend::read_object_for_push_op( const hobject_t& oid, diff --git a/src/crimson/osd/replicated_recovery_backend.h b/src/crimson/osd/replicated_recovery_backend.h index 6a4ed9802ab1d..d99538a759b21 100644 --- a/src/crimson/osd/replicated_recovery_backend.h +++ b/src/crimson/osd/replicated_recovery_backend.h @@ -119,6 +119,16 @@ private: const hobject_t& soid, eversion_t need); + /// read the data attached to given object. the size of them is supposed to + /// be relatively small. + /// + /// @return @c oi.version + seastar::future read_metadata_for_push_op( + const hobject_t& oid, + const ObjectRecoveryProgress& progress, + ObjectRecoveryProgress& new_progress, + eversion_t ver, + PushOp* push_op); /// read the remaining extents of object to be recovered and fill push_op /// with them /// -- 2.39.5