From 5e0daf6642011bf1222c4dc20aa284966fa5df9f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 30 Sep 2016 18:02:39 -0400 Subject: [PATCH] mon/OSDMonitor: encode canonical full osdmap based on osdmap flags If the JEWEL or KRAKEN flags aren't set, encode the full map without those features. This ensure that older OSDs in the cluster will be able to correctly encode the full map with a matching CRC. At least, that is true as long as the encoding changes are guarded by those feature bits. That appears to be true currently, and we plan to ensure that it is true in the future as well. Signed-off-by: Sage Weil --- src/mon/OSDMonitor.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 001575995a4..9b2354cbc47 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1225,8 +1225,21 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t) { tmp.deepish_copy_from(osdmap); tmp.apply_incremental(pending_inc); + + // determine appropriate features + uint64_t features = mon->quorum_features; + if (!tmp.test_flag(CEPH_OSDMAP_REQUIRE_JEWEL)) { + dout(10) << __func__ << " encoding without feature SERVER_JEWEL" << dendl; + features &= ~CEPH_FEATURE_SERVER_JEWEL; + } + if (!tmp.test_flag(CEPH_OSDMAP_REQUIRE_KRAKEN)) { + dout(10) << __func__ << " encoding without feature SERVER_KRAKEN" << dendl; + features &= ~CEPH_FEATURE_SERVER_KRAKEN; + } + dout(10) << __func__ << " encoding full map with " << features << dendl; + bufferlist fullbl; - ::encode(tmp, fullbl, mon->quorum_features | CEPH_FEATURE_RESERVED); + ::encode(tmp, fullbl, features | CEPH_FEATURE_RESERVED); pending_inc.full_crc = tmp.get_crc(); // include full map in the txn. note that old monitors will -- 2.39.5