From a9c4b7f42524fac3c5fe9921efa36a8f49ecf310 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Tue, 14 Aug 2018 16:29:00 +0800 Subject: [PATCH] osd/PrimaryLogPG: optimize recover order By definition, async_recovery_targets should have a lower priority than those coming from the acting set. Signed-off-by: xie xingguo --- src/osd/PrimaryLogPG.cc | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 4d3e131c0a30b..49201de7e66c9 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -12678,7 +12678,8 @@ uint64_t PrimaryLogPG::recover_replicas(uint64_t max, ThreadPool::TPHandle &hand assert(!acting_recovery_backfill.empty()); // choose replicas to recover, replica has the shortest missing list first // so we can bring it back to normal ASAP - std::vector> replicas_by_num_missing; + std::vector> replicas_by_num_missing, + async_by_num_missing; replicas_by_num_missing.reserve(acting_recovery_backfill.size() - 1); for (auto &p: acting_recovery_backfill) { if (p == get_primary()) { @@ -12688,16 +12689,24 @@ uint64_t PrimaryLogPG::recover_replicas(uint64_t max, ThreadPool::TPHandle &hand assert(pm != peer_missing.end()); auto nm = pm->second.num_missing(); if (nm != 0) { - replicas_by_num_missing.push_back(make_pair(nm, p)); + if (async_recovery_targets.count(p)) { + async_by_num_missing.push_back(make_pair(nm, p)); + } else { + replicas_by_num_missing.push_back(make_pair(nm, p)); + } } } // sort by number of missing objects, in ascending order. - std::sort(replicas_by_num_missing.begin(), replicas_by_num_missing.end(), - [](const std::pair &lhs, - const std::pair &rhs) { - return lhs.first < rhs.first; - } - ); + auto func = [](const std::pair &lhs, + const std::pair &rhs) { + return lhs.first < rhs.first; + }; + // acting goes first + std::sort(replicas_by_num_missing.begin(), replicas_by_num_missing.end(), func); + // then async_recovery_targets + std::sort(async_by_num_missing.begin(), async_by_num_missing.end(), func); + replicas_by_num_missing.insert(replicas_by_num_missing.end(), + async_by_num_missing.begin(), async_by_num_missing.end()); for (auto &replica: replicas_by_num_missing) { pg_shard_t &peer = replica.second; assert(peer != get_primary()); -- 2.39.5