]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: properly set last_force_op_resend in stretch mode 45870/head
authorIlya Dryomov <idryomov@gmail.com>
Tue, 29 Mar 2022 15:53:57 +0000 (17:53 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 12 Apr 2022 08:48:13 +0000 (10:48 +0200)
Setting last_force_op_resend but not last_force_op_resend_prenautilus
and last_force_op_resend_preluminous doesn't make sense.  The reverse,
such as

  last_force_op_resend = 0
  last_force_op_resend_prenautilus = 0
  last_force_op_resend_preluminous = 20

or

  last_force_op_resend = 0
  last_force_op_resend_prenautilus = 40
  last_force_op_resend_preluminous = 40

is valid in PG split/merge cases (and is the reason prenautilus and
preluminous fields actually exist and aren't just encoding artifacts),
but, if last_force_op_resend is set, both prenautilus and preluminous
fields should really be set to the same value.  Otherwise it basically
amounts to "nautilus+ clients need to resend in-flight ops on stretch
mode transitions but pre-nautilus clients don't" which is bogus as it
leaves pre-nautilus clients exposed to the nastiness that necessitated
employing the force resend hammer in the first place in commit
97fbd19ccd02 ("osd: mon: account for stretch bucket configs/changes
when detecting intervals").

Fixes: https://tracker.ceph.com/issues/55158
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
(cherry picked from commit 609a648e7eba69ee9d1f18685cc5a8e74994a750)

src/mon/OSDMonitor.cc

index d259910bea5795a5f590492d2472c74458aabb7b..32cd36166b243a3ada7acb5abfba52a12026d8b0 100644 (file)
@@ -14620,7 +14620,7 @@ void OSDMonitor::trigger_degraded_stretch_mode(const set<int>& dead_buckets,
       newp.peering_crush_bucket_count = new_site_count;
       newp.peering_crush_mandatory_member = remaining_site;
       newp.min_size = pgi.second.min_size / 2; // only support 2 zones now
-      newp.last_force_op_resend = pending_inc.epoch;
+      newp.set_last_force_op_resend(pending_inc.epoch);
     }
   }
   propose_pending();
@@ -14640,7 +14640,7 @@ void OSDMonitor::trigger_recovery_stretch_mode()
   for (auto pgi : osdmap.pools) {
     if (pgi.second.peering_crush_bucket_count) {
       pg_pool_t& newp = *pending_inc.get_new_pool(pgi.first, &pgi.second);
-      newp.last_force_op_resend = pending_inc.epoch;
+      newp.set_last_force_op_resend(pending_inc.epoch);
     }
   }
   propose_pending();
@@ -14726,7 +14726,7 @@ void OSDMonitor::trigger_healthy_stretch_mode()
       newp.peering_crush_bucket_count = osdmap.stretch_bucket_count;
       newp.peering_crush_mandatory_member = CRUSH_ITEM_NONE;
       newp.min_size = g_conf().get_val<uint64_t>("mon_stretch_pool_min_size");
-      newp.last_force_op_resend = pending_inc.epoch;
+      newp.set_last_force_op_resend(pending_inc.epoch);
     }
   }
   propose_pending();