]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: encode canonical full osdmap based on osdmap flags
authorSage Weil <sage@redhat.com>
Fri, 30 Sep 2016 22:02:39 +0000 (18:02 -0400)
committerLoic Dachary <ldachary@redhat.com>
Fri, 4 Nov 2016 14:35:45 +0000 (15:35 +0100)
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 <sage@redhat.com>
(cherry picked from commit 5e0daf6642011bf1222c4dc20aa284966fa5df9f)

Conflicts:
   src/mon/OSDMonitor.cc: removed reference to kraken

    if (!tmp.test_flag(CEPH_OSDMAP_REQUIRE_KRAKEN)) {
      dout(10) << __func__ << " encoding without feature SERVER_KRAKEN" << dendl;
      features &= ~CEPH_FEATURE_SERVER_KRAKEN;
    }

src/mon/OSDMonitor.cc

index 27c994d7079343335f132ecd3e238d659ae20d13..3dc644ef826c7503e71bb20a75172c08c633ed33 100644 (file)
@@ -1208,8 +1208,17 @@ 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;
+    }
+    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