From: Joao Eduardo Luis Date: Mon, 1 Feb 2016 17:27:43 +0000 (+0000) Subject: mon: rename quorum_features to quorum_con_features X-Git-Tag: v11.1.0~400^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5a42eda59da4377dbba3eb93eed0439240e2fbdf;p=ceph.git mon: rename quorum_features to quorum_con_features Because now we have quorum_mon_features too. Signed-off-by: Joao Eduardo Luis --- diff --git a/src/mon/AuthMonitor.cc b/src/mon/AuthMonitor.cc index d148d050095e..b64a41271f90 100644 --- a/src/mon/AuthMonitor.cc +++ b/src/mon/AuthMonitor.cc @@ -236,7 +236,7 @@ void AuthMonitor::encode_pending(MonitorDBStore::TransactionRef t) ::encode(v, bl); vector::iterator p; for (p = pending_auth.begin(); p != pending_auth.end(); ++p) - p->encode(bl, mon->get_quorum_features()); + p->encode(bl, mon->get_quorum_con_features()); version_t version = get_last_committed() + 1; put_version(t, version, bl); diff --git a/src/mon/LogMonitor.cc b/src/mon/LogMonitor.cc index 6619e6bb11d8..50e36a35a150 100644 --- a/src/mon/LogMonitor.cc +++ b/src/mon/LogMonitor.cc @@ -216,7 +216,7 @@ void LogMonitor::encode_pending(MonitorDBStore::TransactionRef t) ::encode(v, bl); multimap::iterator p; for (p = pending_log.begin(); p != pending_log.end(); ++p) - p->second.encode(bl, mon->quorum_features); + p->second.encode(bl, mon->get_quorum_con_features()); put_version(t, version, bl); put_last_committed(t, version); @@ -228,7 +228,7 @@ void LogMonitor::encode_full(MonitorDBStore::TransactionRef t) assert(get_last_committed() == summary.version); bufferlist summary_bl; - ::encode(summary, summary_bl, mon->quorum_features); + ::encode(summary, summary_bl, mon->get_quorum_con_features()); put_version_full(t, summary.version, summary_bl); put_version_latest_full(t, summary.version); diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 122253ab278b..78c00fec76bd 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -101,7 +101,7 @@ 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; - if (mon->get_quorum_features() & CEPH_FEATURE_SERVER_JEWEL) { + if (mon->get_quorum_con_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. @@ -196,7 +196,7 @@ void MDSMonitor::encode_pending(MonitorDBStore::TransactionRef t) // apply to paxos assert(get_last_committed() + 1 == pending_fsmap.epoch); bufferlist fsmap_bl; - pending_fsmap.encode(fsmap_bl, mon->get_quorum_features()); + pending_fsmap.encode(fsmap_bl, mon->get_quorum_con_features()); /* put everything in the transaction */ put_version(t, pending_fsmap.epoch, fsmap_bl); @@ -1545,7 +1545,7 @@ class FlagSetHandler : public FileSystemCommandHandler return r; } - bool jewel = mon->get_quorum_features() & CEPH_FEATURE_SERVER_JEWEL; + bool jewel = mon->get_quorum_con_features() && CEPH_FEATURE_SERVER_JEWEL; if (flag_bool && !jewel) { ss << "Multiple-filesystems are forbidden until all mons are updated"; return -EINVAL; diff --git a/src/mon/MonMap.cc b/src/mon/MonMap.cc index b253c20799f1..dc2503c93934 100644 --- a/src/mon/MonMap.cc +++ b/src/mon/MonMap.cc @@ -18,9 +18,9 @@ using ceph::Formatter; -void MonMap::encode(bufferlist& blist, uint64_t features) const +void MonMap::encode(bufferlist& blist, uint64_t con_features) const { - if ((features & CEPH_FEATURE_MONNAMES) == 0) { + if ((con_features & CEPH_FEATURE_MONNAMES) == 0) { __u16 v = 1; ::encode(v, blist); ::encode_raw(fsid, blist); @@ -28,34 +28,36 @@ void MonMap::encode(bufferlist& blist, uint64_t features) const vector mon_inst(mon_addr.size()); for (unsigned n = 0; n < mon_addr.size(); n++) mon_inst[n] = get_inst(n); - ::encode(mon_inst, blist, features); + ::encode(mon_inst, blist, con_features); ::encode(last_changed, blist); ::encode(created, blist); return; } - if ((features & CEPH_FEATURE_MONENC) == 0) { + if ((con_features & CEPH_FEATURE_MONENC) == 0) { __u16 v = 2; ::encode(v, blist); ::encode_raw(fsid, blist); ::encode(epoch, blist); - ::encode(mon_addr, blist, features); + ::encode(mon_addr, blist, con_features); ::encode(last_changed, blist); ::encode(created, blist); } - ENCODE_START(3, 3, blist); + ENCODE_START(4, 3, blist); ::encode_raw(fsid, blist); ::encode(epoch, blist); - ::encode(mon_addr, blist, features); + ::encode(mon_addr, blist, con_features); ::encode(last_changed, blist); ::encode(created, blist); + ::encode(persistent_features, blist); + ::encode(optional_features, blist); ENCODE_FINISH(blist); } void MonMap::decode(bufferlist::iterator &p) { - DECODE_START_LEGACY_COMPAT_LEN_16(3, 3, 3, p); + DECODE_START_LEGACY_COMPAT_LEN_16(4, 3, 3, p); ::decode_raw(fsid, p); ::decode(epoch, p); if (struct_v == 1) { @@ -73,6 +75,11 @@ void MonMap::decode(bufferlist::iterator &p) } ::decode(last_changed, p); ::decode(created, p); + if (struct_v >= 4) { + ::decode(persistent_features, p); + ::decode(optional_features, p); + } + DECODE_FINISH(p); calc_ranks(); } @@ -135,6 +142,10 @@ void MonMap::dump(Formatter *f) const f->dump_stream("fsid") << fsid; f->dump_stream("modified") << last_changed; f->dump_stream("created") << created; + f->open_object_section("features"); + persistent_features.dump(f, "persistent"); + optional_features.dump(f, "optional"); + f->close_section(); f->open_array_section("mons"); int i = 0; for (map::const_iterator p = addr_name.begin(); diff --git a/src/mon/MonMap.h b/src/mon/MonMap.h index f9dbcce3c756..3f1150450adf 100644 --- a/src/mon/MonMap.h +++ b/src/mon/MonMap.h @@ -19,11 +19,13 @@ #include "msg/Message.h" #include "include/types.h" +#include "mon/mon_types.h" namespace ceph { class Formatter; } + class MonMap { public: epoch_t epoch; // what epoch/version of the monmap @@ -36,6 +38,41 @@ class MonMap { vector rank_name; vector rank_addr; + /** + * Persistent Features are all those features that once set on a + * monmap cannot, and should not, be removed. These will define the + * non-negotiable features that a given monitor must support to + * properly operate in a given quorum. + * + * Should be reserved for features that we really want to make sure + * are sticky, and are important enough to tolerate not being able + * to downgrade a monitor. + */ + mon_feature_t persistent_features; + /** + * Optional Features are all those features that can be enabled or + * disabled following a given criteria -- e.g., user-mandated via the + * cli --, and act much like indicators of what the cluster currently + * supports. + * + * They are by no means "optional" in the sense that monitors can + * ignore them. Just that they are not persistent. + */ + mon_feature_t optional_features; + + /** + * Returns the set of features required by this monmap. + * + * The features required by this monmap is the union of all the + * currently set persistent features and the currently set optional + * features. + * + * @returns the set of features required by this monmap + */ + mon_feature_t get_required_features() const { + return (persistent_features | optional_features); + } + void calc_ranks() { rank_name.resize(mon_addr.size()); rank_addr.resize(mon_addr.size()); @@ -55,7 +92,7 @@ class MonMap { } } - MonMap() + MonMap() : epoch(0) { memset(&fsid, 0, sizeof(fsid)); } @@ -82,7 +119,7 @@ class MonMap { mon_addr[name] = addr; calc_ranks(); } - + void remove(const string &name) { assert(mon_addr.count(name)); mon_addr.erase(name); @@ -172,7 +209,7 @@ class MonMap { return i; } - void encode(bufferlist& blist, uint64_t features) const; + void encode(bufferlist& blist, uint64_t con_features) const; void decode(bufferlist& blist) { bufferlist::iterator p = blist.begin(); decode(p); diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 2f340f81dc4f..2585914754d0 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -166,7 +166,7 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s, elector(this), required_features(0), leader(0), - quorum_features(0), + quorum_con_features(0), // scrub scrub_version(0), scrub_event(NULL), @@ -1891,7 +1891,7 @@ void Monitor::win_election(epoch_t epoch, set& active, uint64_t features, leader_since = ceph_clock_now(g_ceph_context); leader = rank; quorum = active; - quorum_features = features; + quorum_con_features = features; quorum_mon_features = mon_features; outside_quorum.clear(); @@ -1938,10 +1938,10 @@ void Monitor::lose_election(epoch_t epoch, set &q, int l, leader = l; quorum = q; outside_quorum.clear(); - quorum_features = features; + quorum_con_features = features; quorum_mon_features = mon_features; dout(10) << "lose_election, epoch " << epoch << " leader is mon" << leader - << " quorum is " << quorum << " features are " << quorum_features + << " quorum is " << quorum << " features are " << quorum_con_features << " mon_features are " << quorum_mon_features << dendl; @@ -1953,7 +1953,7 @@ void Monitor::lose_election(epoch_t epoch, set &q, int l, finish_election(); - if (quorum_features & CEPH_FEATURE_MON_METADATA) { + if (quorum_con_features & CEPH_FEATURE_MON_METADATA) { Metadata sys_info; collect_sys_info(&sys_info, g_ceph_context); messenger->send_message(new MMonMetadata(sys_info), @@ -1984,16 +1984,16 @@ void Monitor::finish_election() void Monitor::apply_quorum_to_compatset_features() { CompatSet new_features(features); - if (quorum_features & CEPH_FEATURE_OSD_ERASURE_CODES) { + if (quorum_con_features & CEPH_FEATURE_OSD_ERASURE_CODES) { new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_OSD_ERASURE_CODES); } - if (quorum_features & CEPH_FEATURE_OSDMAP_ENC) { + if (quorum_con_features & CEPH_FEATURE_OSDMAP_ENC) { new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_OSDMAP_ENC); } - if (quorum_features & CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2) { + if (quorum_con_features & CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2) { new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_ERASURE_CODE_PLUGINS_V2); } - if (quorum_features & CEPH_FEATURE_ERASURE_CODE_PLUGINS_V3) { + if (quorum_con_features & CEPH_FEATURE_ERASURE_CODE_PLUGINS_V3) { new_features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_ERASURE_CODE_PLUGINS_V3); } if (new_features.compare(features) != 0) { @@ -3284,7 +3284,7 @@ void Monitor::try_send_message(Message *m, const entity_inst_t& to) dout(10) << "try_send_message " << *m << " to " << to << dendl; bufferlist bl; - encode_message(m, quorum_features, bl); + encode_message(m, quorum_con_features, bl); messenger->send_message(m, to); diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index bfdc5e59e302..5bbfd06c74c6 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -215,7 +215,10 @@ private: set quorum; // current active set of monitors (if !starting) utime_t leader_since; // when this monitor became the leader, if it is the leader utime_t exited_quorum; // time detected as not in quorum; 0 if in - uint64_t quorum_features; ///< intersection of quorum member feature bits + /** + * Intersection of quorum member's connection feature bits. + */ + uint64_t quorum_con_features; /** * Intersection of quorum members mon-specific feature bits */ @@ -584,8 +587,8 @@ public: q.push_back(monmap->get_name(*p)); return q; } - uint64_t get_quorum_features() const { - return quorum_features; + uint64_t get_quorum_con_features() const { + return quorum_con_features; } uint64_t get_required_features() const { return required_features; diff --git a/src/mon/MonmapMonitor.cc b/src/mon/MonmapMonitor.cc index a36679e4062e..1b84c327abb8 100644 --- a/src/mon/MonmapMonitor.cc +++ b/src/mon/MonmapMonitor.cc @@ -89,7 +89,7 @@ void MonmapMonitor::encode_pending(MonitorDBStore::TransactionRef t) assert(mon->monmap->epoch + 1 == pending_map.epoch || pending_map.epoch == 1); // special case mkfs! bufferlist bl; - pending_map.encode(bl, mon->get_quorum_features()); + pending_map.encode(bl, mon->get_quorum_con_features()); put_version(t, pending_map.epoch, bl); put_last_committed(t, pending_map.epoch); diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index ef0d87a9be4e..4c2b5f2f122f 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -132,7 +132,8 @@ void OSDMonitor::create_initial() newmap.set_flag(CEPH_OSDMAP_REQUIRE_KRAKEN); // encode into pending incremental - newmap.encode(pending_inc.fullmap, mon->quorum_features | CEPH_FEATURE_RESERVED); + newmap.encode(pending_inc.fullmap, + mon->get_quorum_con_features() | CEPH_FEATURE_RESERVED); pending_inc.full_crc = newmap.get_crc(); dout(20) << " full crc " << pending_inc.full_crc << dendl; } @@ -238,7 +239,7 @@ void OSDMonitor::update_from_paxos(bool *need_bootstrap) // encode with all features. uint64_t f = inc.encode_features; if (!f) - f = mon->quorum_features; + f = mon->get_quorum_con_features(); if (!f) f = -1; bufferlist full_bl; @@ -1223,7 +1224,7 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t) } // features for osdmap and its incremental - uint64_t features = mon->quorum_features; + uint64_t features = mon->get_quorum_con_features(); // encode full map and determine its crc OSDMap tmp; @@ -4624,7 +4625,7 @@ int OSDMonitor::check_cluster_features(uint64_t features, { stringstream unsupported_ss; int unsupported_count = 0; - if ((mon->get_quorum_features() & features) != features) { + if ((mon->get_quorum_con_features() & features) != features) { unsupported_ss << "the monitor cluster"; ++unsupported_count; } diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 938c3bcc2a0d..1ed5f16bac02 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -479,7 +479,7 @@ void PGMonitor::encode_pending(MonitorDBStore::TransactionRef t) assert(get_last_committed() + 1 == version); pending_inc.stamp = ceph_clock_now(g_ceph_context); - uint64_t features = mon->get_quorum_features(); + uint64_t features = mon->get_quorum_con_features(); string prefix = pgmap_meta_prefix;