From: Sage Weil Date: Wed, 13 Aug 2014 22:05:05 +0000 (-0700) Subject: mds/MDSMap: fix incompat version for encoding X-Git-Tag: v0.84~6^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d74d3f1cd69332fd9ae844f1e929aca5452c7e30;p=ceph.git mds/MDSMap: fix incompat version for encoding Back in 8f7900a09c8e490c9cd3a6f92ed1f0eb1f47f2a9 we added the new fields before the 'extended' section, which made the encoding incompatible. Instead, add them at the end--old clients don't care whether the enabled flag is set or what the 'fs name' is. Fixes: #8725 Signed-off-by: Sage Weil --- diff --git a/src/mds/MDSMap.cc b/src/mds/MDSMap.cc index 8a25d55cde1d..54ebf16fb9e6 100644 --- a/src/mds/MDSMap.cc +++ b/src/mds/MDSMap.cc @@ -480,7 +480,7 @@ void MDSMap::encode(bufferlist& bl, uint64_t features) const return; } - ENCODE_START(5, 5, bl); + ENCODE_START(5, 4, bl); ::encode(epoch, bl); ::encode(flags, bl); ::encode(last_failure, bl); @@ -492,11 +492,9 @@ void MDSMap::encode(bufferlist& bl, uint64_t features) const ::encode(mds_info, bl, features); ::encode(data_pools, bl); ::encode(cas_pool, bl); - ::encode(enabled, bl); - ::encode(fs_name, bl); // kclient ignores everything from here - __u16 ev = 7; + __u16 ev = 8; ::encode(ev, bl); ::encode(compat, bl); ::encode(metadata_pool, bl); @@ -512,6 +510,8 @@ void MDSMap::encode(bufferlist& bl, uint64_t features) const ::encode(ever_allowed_snaps, bl); ::encode(explicitly_allowed_snaps, bl); ::encode(inline_data_enabled, bl); + ::encode(enabled, bl); + ::encode(fs_name, bl); ENCODE_FINISH(bl); } @@ -542,20 +542,6 @@ void MDSMap::decode(bufferlist::iterator& p) ::decode(data_pools, p); ::decode(cas_pool, p); } - if (struct_v >= 5) { - ::decode(enabled, p); - ::decode(fs_name, p); - } else { - if (epoch > 1) { - // If an MDS has ever been started, epoch will be greater than 1, - // assume filesystem is enabled. - enabled = true; - } else { - // Upgrading from a cluster that never used an MDS, switch off - // filesystem until it's explicitly enabled. - enabled = false; - } - } // kclient ignores everything from here __u16 ev = 1; @@ -591,5 +577,21 @@ void MDSMap::decode(bufferlist::iterator& p) } if (ev >= 7) ::decode(inline_data_enabled, p); + + if (ev >= 8) { + assert(struct_v >= 5); + ::decode(enabled, p); + ::decode(fs_name, p); + } else { + if (epoch > 1) { + // If an MDS has ever been started, epoch will be greater than 1, + // assume filesystem is enabled. + enabled = true; + } else { + // Upgrading from a cluster that never used an MDS, switch off + // filesystem until it's explicitly enabled. + enabled = false; + } + } DECODE_FINISH(p); }