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 <bill_scales@uk.ibm.com>
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)) {