From 80d8dedc2345f05f51cb6943c5582a16bc252789 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Tue, 29 Mar 2022 17:53:57 +0200 Subject: [PATCH] mon/OSDMonitor: properly set last_force_op_resend in stretch mode 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 (cherry picked from commit 609a648e7eba69ee9d1f18685cc5a8e74994a750) --- src/mon/OSDMonitor.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index d259910bea579..32cd36166b243 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -14620,7 +14620,7 @@ void OSDMonitor::trigger_degraded_stretch_mode(const set& 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("mon_stretch_pool_min_size"); - newp.last_force_op_resend = pending_inc.epoch; + newp.set_last_force_op_resend(pending_inc.epoch); } } propose_pending(); -- 2.39.5