]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: conditionally encode old monmap when peer lacks feature
authorSage Weil <sage@inktank.com>
Thu, 21 Jun 2012 02:08:34 +0000 (19:08 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 22 Jun 2012 00:10:29 +0000 (17:10 -0700)
This allows a rolling upgrade from 0.47.2 to 0.48.

Signed-off-by: Sage Weil <sage@inktank.com>
src/messages/MMonElection.h
src/messages/MMonMap.h
src/messages/MMonProbe.h

index b35cbd566b59ffeada45a0b6504ab633107bb386..e9dcfcb8c6ca2b37e5bd48cb50992bc7ad52b9ee 100644 (file)
@@ -60,6 +60,14 @@ public:
   }
   
   void encode_payload(uint64_t features) {
+    if (monmap_bl.length() && (features & CEPH_FEATURE_MONENC) == 0) {
+      // reencode old-format monmap
+      MonMap t;
+      t.decode(monmap_bl);
+      monmap_bl.clear();
+      t.encode(monmap_bl, features);
+    }
+
     ::encode(fsid, payload);
     ::encode(op, payload);
     ::encode(epoch, payload);
index a314594752f291aa2225c7a8d340b1258b670cc9..3e950fa6f63904b092658b618592623486e88337 100644 (file)
@@ -15,7 +15,9 @@
 #ifndef CEPH_MMONMAP_H
 #define CEPH_MMONMAP_H
 
+#include "include/ceph_features.h"
 #include "msg/Message.h"
+#include "mon/MonMap.h"
 
 class MMonMap : public Message {
 public:
@@ -32,6 +34,14 @@ public:
   const char *get_type_name() const { return "mon_map"; }
 
   void encode_payload(uint64_t features) { 
+    if (monmapbl.length() && (features & CEPH_FEATURE_MONENC) == 0) {
+      // reencode old-format monmap
+      MonMap t;
+      t.decode(monmapbl);
+      monmapbl.clear();
+      t.encode(monmapbl, features);
+    }
+
     ::encode(monmapbl, payload);
   }
   void decode_payload() { 
index 72144ab0f1853adb09176599df6e5eb820c523a9..e7ea1193731a66058fd41799105744abcfa9ea30 100644 (file)
@@ -16,6 +16,7 @@
 #ifndef CEPH_MMONPROBE_H
 #define CEPH_MMONPROBE_H
 
+#include "include/ceph_features.h"
 #include "msg/Message.h"
 #include "mon/MonMap.h"
 
@@ -81,6 +82,14 @@ public:
   }
   
   void encode_payload(uint64_t features) {
+    if (monmap_bl.length() && (features & CEPH_FEATURE_MONENC) == 0) {
+      // reencode old-format monmap
+      MonMap t;
+      t.decode(monmap_bl);
+      monmap_bl.clear();
+      t.encode(monmap_bl, features);
+    }
+
     ::encode(fsid, payload);
     ::encode(op, payload);
     ::encode(name, payload);