]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PeeringState: do not exclude up from acting_recovery_backfill 31703/head
authorxie xingguo <xie.xingguo@zte.com.cn>
Wed, 20 Nov 2019 00:31:54 +0000 (08:31 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Wed, 20 Nov 2019 00:32:19 +0000 (08:32 +0800)
If we choose a primary that does not belong to the current up set,
and all up peers are still recoverable, then we might end up excluding
some up peer from the acting_recovery_backfill set too due to the
"want size <= pool size" constraint (since https://github.com/ceph/ceph/pull/24035),
as a result of which all up peers might not get recovered in one go.

Fix by falling through any oversized want set to async recovery, which
should be able to handle it nicely.

Fixes: https://tracker.ceph.com/issues/42577
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/osd/PeeringState.cc

index 17030737506d7c06c64feef962912d166dc450ed..a9b5b4fde41d974254a3a60cb611c03c31ee543f 100644 (file)
@@ -2077,6 +2077,14 @@ bool PeeringState::choose_acting(pg_shard_t &auth_log_shard_id,
        get_osdmap());
     }
   }
+  while (want.size() > pool.info.size) {
+    // async recovery should have taken out as many osds as it can.
+    // if not, then always evict the last peer
+    // (will get synchronously recovered later)
+    psdout(10) << __func__ << " evicting osd." << want.back()
+               << " from oversized want " << want << dendl;
+    want.pop_back();
+  }
   if (want != acting) {
     psdout(10) << __func__ << " want " << want << " != acting " << acting
               << ", requesting pg_temp change" << dendl;