From: John Spray Date: Mon, 21 Mar 2016 12:07:25 +0000 (+0000) Subject: mon: fix mixed-version MDSMonitor X-Git-Tag: v10.1.0~7^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F8239%2Fhead;p=ceph.git mon: fix mixed-version MDSMonitor Encode old-style until mon quorum features indicate jewel, forbid creating multiple filesystems, and when creating a single filesystem use the legacy fscid. Fixes: #15223 Signed-off-by: John Spray --- diff --git a/src/mds/FSMap.cc b/src/mds/FSMap.cc index cf8c7aed30aaa..094b78e01e16b 100644 --- a/src/mds/FSMap.cc +++ b/src/mds/FSMap.cc @@ -213,21 +213,43 @@ void FSMap::get_health(list >& summary, void FSMap::encode(bufferlist& bl, uint64_t features) const { - ENCODE_START(6, 6, bl); - ::encode(epoch, bl); - ::encode(next_filesystem_id, bl); - ::encode(legacy_client_fscid, bl); - ::encode(compat, bl); - ::encode(enable_multiple, bl); - std::vector fs_list; - for (auto i : filesystems) { - fs_list.push_back(*(i.second)); + if (features & CEPH_FEATURE_SERVER_JEWEL) { + ENCODE_START(6, 6, bl); + ::encode(epoch, bl); + ::encode(next_filesystem_id, bl); + ::encode(legacy_client_fscid, bl); + ::encode(compat, bl); + ::encode(enable_multiple, bl); + std::vector fs_list; + for (auto i : filesystems) { + fs_list.push_back(*(i.second)); + } + ::encode(fs_list, bl); + ::encode(mds_roles, bl); + ::encode(standby_daemons, bl, features); + ::encode(standby_epochs, bl); + ENCODE_FINISH(bl); + } else { + if (filesystems.empty()) { + MDSMap disabled_map; + disabled_map.epoch = epoch; + disabled_map.encode(bl, features); + } else { + // MDSMonitor should never have created multiple filesystems + // until the quorum features indicated Jewel + assert(filesystems.size() == 1); + auto fs = filesystems.begin()->second; + + // Take the MDSMap for the enabled filesystem, and populated its + // mds_info with the standbys to get a pre-jewel-style mon MDSMap. + MDSMap full_mdsmap = fs->mds_map; + full_mdsmap.epoch = epoch; + for (const auto p : standby_daemons) { + full_mdsmap.mds_info[p.first] = p.second; + } + full_mdsmap.encode(bl, features); + } } - ::encode(fs_list, bl); - ::encode(mds_roles, bl); - ::encode(standby_daemons, bl, features); - ::encode(standby_epochs, bl); - ENCODE_FINISH(bl); } void FSMap::decode(bufferlist::iterator& p) diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 5d943920ccff3..4394b348710bb 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -98,13 +98,19 @@ void MDSMonitor::create_new_fs(FSMap &fsm, const std::string &name, fs->mds_map.session_timeout = g_conf->mds_session_timeout; fs->mds_map.session_autoclose = g_conf->mds_session_autoclose; fs->mds_map.enabled = true; - fs->fscid = fsm.next_filesystem_id++; + if (mon->get_quorum_features() & CEPH_FEATURE_SERVER_JEWEL) { + fs->fscid = fsm.next_filesystem_id++; + // ANONYMOUS is only for upgrades from legacy mdsmaps, we should + // have initialized next_filesystem_id such that it's never used here. + assert(fs->fscid != FS_CLUSTER_ID_ANONYMOUS); + } else { + // Use anon fscid because this will get thrown away when encoding + // as legacy MDSMap for legacy mons. + assert(fsm.filesystems.empty()); + fs->fscid = FS_CLUSTER_ID_ANONYMOUS; + } fsm.filesystems[fs->fscid] = fs; - // ANONYMOUS is only for upgrades from legacy mdsmaps, we should - // have initialized next_filesystem_id such that it's never used here. - assert(fs->fscid != FS_CLUSTER_ID_ANONYMOUS); - // Created first filesystem? Set it as the one // for legacy clients to use if (fsm.filesystems.size() == 1) { @@ -1507,6 +1513,13 @@ class FlagSetHandler : public FileSystemCommandHandler ss << "Invalid boolean value '" << flag_val << "'"; return r; } + + bool jewel = mon->get_quorum_features() && CEPH_FEATURE_SERVER_JEWEL; + if (flag_bool && !jewel) { + ss << "Multiple-filesystems are forbidden until all mons are updated"; + return -EINVAL; + } + fsmap.set_enable_multiple(flag_bool); return 0; } else {