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)
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();
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();
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();