From ce5882778db9b92b14a6bb5eca22e3cecf2be9dc Mon Sep 17 00:00:00 2001 From: Bill Scales Date: Fri, 15 May 2026 15:39:25 +0100 Subject: [PATCH] osd: Fix bug when calculating min_peer_features PeeringState calculates the minimum set of features for the set of OSDs within a PG. There is a bug when the peer info has already been cached where these peers features are not included in the calculation. This can lead to the min feature set including features that not all OSDs have. Previously this just made some asserts less aggressive than they should have been. Pull request https://github.com/ceph/ceph/pull/57740 uses min_peer_features to decide how to encode messages to other OSDs. Midway through an upgrade this bug can cause an OSD to send the wrong version of a message to a downlevel OSD causing it to abort. Fixes: https://tracker.ceph.com/issues/76600 Signed-off-by: Bill Scales --- src/osd/PeeringState.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 66a14168580..8fca10435fe 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -7535,7 +7535,10 @@ void PeeringState::GetInfo::get_infos() continue; } if (ps->peer_info.count(peer)) { - psdout(10) << " have osd." << peer << " info " << ps->peer_info[peer] << dendl; + uint64_t f = ps->get_osdmap()->get_xinfo(peer.osd).features; + psdout(10) << " have osd." << peer << " info " << ps->peer_info[peer] + << " peer features: " << hex << f << dec << dendl; + ps->apply_peer_features(f); continue; } if (peer_info_requested.count(peer)) { -- 2.47.3