]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PrimaryLogPG: optimize recover order
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 14 Aug 2018 08:29:00 +0000 (16:29 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Fri, 17 Aug 2018 00:23:53 +0000 (08:23 +0800)
By definition, async_recovery_targets should have a lower
priority than those coming from the acting set.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/osd/PrimaryLogPG.cc

index 4d3e131c0a30bbf415dc8847a2100ae241bc044e..49201de7e66c9d503ef706a389fbf1f6a4651551 100644 (file)
@@ -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<std::pair<unsigned int, pg_shard_t>> replicas_by_num_missing;
+  std::vector<std::pair<unsigned int, pg_shard_t>> 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<unsigned int, pg_shard_t> &lhs,
-       const std::pair<unsigned int, pg_shard_t> &rhs) {
-      return lhs.first < rhs.first;
-    }
-  );
+  auto func = [](const std::pair<unsigned int, pg_shard_t> &lhs,
+                 const std::pair<unsigned int, pg_shard_t> &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());