From: Kefu Chai Date: Thu, 17 Dec 2020 03:15:04 +0000 (+0800) Subject: crimson/osd: create the collected push ops use shared_ptr X-Git-Tag: v16.1.0~202^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d53d23e3df9174be9daa2d8df5a64f0df6340606;p=ceph.git crimson/osd: create the collected push ops use shared_ptr do_with() uses a unique_ptr for keeping the captured variables alive. so it is practically the same thing in concept. but `do_with()` is more distracting and difficult to reason about, it increases the indent level also. so use a lw_shared_ptr() for collecting the push ops map. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index da32ee8b7b4d..8173489055d2 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -288,59 +288,52 @@ ReplicatedRecoveryBackend::prep_push( { logger().debug("{}: {}, {}", __func__, soid, need); - return seastar::do_with(std::map(), - std::map>(), - [this, soid, &shards](auto& pops, - auto& data_subsets) { - return seastar::parallel_for_each(shards, - [this, soid, pops, &data_subsets](auto pg_shard) mutable { - pops.emplace(pg_shard, PushOp()); - auto& recovery_waiter = recovering.at(soid); - auto& obc = recovery_waiter.obc; - auto& data_subset = data_subsets[pg_shard]; - - if (obc->obs.oi.size) { - data_subset.insert(0, obc->obs.oi.size); - } - const auto& missing = pg.get_shard_missing().find(pg_shard)->second; - if (HAVE_FEATURE(pg.min_peer_features(), SERVER_OCTOPUS)) { - const auto it = missing.get_items().find(soid); - assert(it != missing.get_items().end()); - data_subset.intersection_of(it->second.clean_regions.get_dirty_regions()); - logger().debug("calc_head_subsets {} data_subset {}", soid, data_subset); - } + auto pops = seastar::make_lw_shared>(); + return seastar::parallel_for_each(shards, + [this, soid, pops](auto pg_shard) mutable { + auto& recovery_waiter = recovering.at(soid); + auto& obc = recovery_waiter.obc; + interval_set data_subset; + if (obc->obs.oi.size) { + data_subset.insert(0, obc->obs.oi.size); + } + const auto& missing = pg.get_shard_missing().find(pg_shard)->second; + if (HAVE_FEATURE(pg.min_peer_features(), SERVER_OCTOPUS)) { + const auto it = missing.get_items().find(soid); + assert(it != missing.get_items().end()); + data_subset.intersection_of(it->second.clean_regions.get_dirty_regions()); + logger().debug("prep_push: {} data_subset {}", soid, data_subset); + } - logger().debug("prep_push: {} to {}", soid, pg_shard); - auto& pi = recovery_waiter.pushing[pg_shard]; - pg.begin_peer_recover(pg_shard, soid); - const auto pmissing_iter = pg.get_shard_missing().find(pg_shard); - const auto missing_iter = pmissing_iter->second.get_items().find(soid); - assert(missing_iter != pmissing_iter->second.get_items().end()); + logger().debug("prep_push: {} to {}", soid, pg_shard); + auto& pi = recovery_waiter.pushing[pg_shard]; + pg.begin_peer_recover(pg_shard, soid); + const auto pmissing_iter = pg.get_shard_missing().find(pg_shard); + const auto missing_iter = pmissing_iter->second.get_items().find(soid); + assert(missing_iter != pmissing_iter->second.get_items().end()); - pi.obc = obc; - pi.recovery_info.size = obc->obs.oi.size; - pi.recovery_info.copy_subset = data_subset; - pi.recovery_info.soid = soid; - pi.recovery_info.oi = obc->obs.oi; - pi.recovery_info.version = obc->obs.oi.version; - pi.recovery_info.object_exist = - missing_iter->second.clean_regions.object_is_exist(); - pi.recovery_progress.omap_complete = - !missing_iter->second.clean_regions.omap_is_dirty() && - HAVE_FEATURE(pg.min_peer_features(), SERVER_OCTOPUS); + pi.obc = obc; + pi.recovery_info.size = obc->obs.oi.size; + pi.recovery_info.copy_subset = data_subset; + pi.recovery_info.soid = soid; + pi.recovery_info.oi = obc->obs.oi; + pi.recovery_info.version = obc->obs.oi.version; + pi.recovery_info.object_exist = + missing_iter->second.clean_regions.object_is_exist(); + pi.recovery_progress.omap_complete = + (!missing_iter->second.clean_regions.omap_is_dirty() && + HAVE_FEATURE(pg.min_peer_features(), SERVER_OCTOPUS)); - return build_push_op(pi.recovery_info, pi.recovery_progress, - &pi.stat).then( - [this, soid, pg_shard, &pops](auto pop) { - auto& recovery_waiter = recovering.at(soid); - auto& pi = recovery_waiter.pushing[pg_shard]; - pi.recovery_progress = pop.after_progress; - pops[pg_shard] = std::move(pop); - return seastar::make_ready_future<>(); - }); - }).then([&pops]() mutable { - return seastar::make_ready_future>(std::move(pops)); + return build_push_op(pi.recovery_info, pi.recovery_progress, + &pi.stat).then( + [this, soid, pg_shard, pops](auto pop) { + auto& recovery_waiter = recovering.at(soid); + auto& pi = recovery_waiter.pushing[pg_shard]; + pi.recovery_progress = pop.after_progress; + pops->emplace(pg_shard, std::move(pop)); }); + }).then([pops]() mutable { + return seastar::make_ready_future>(std::move(*pops)); }); }