This is simpler and cleaner.
Signed-off-by: Sage Weil <sage@inktank.com>
}
-void Elector::refresh_required_features()
-{
- required_features = mon->apply_compatset_features_to_quorum_requirements();
-}
-
void Elector::start()
{
if (!participating) {
acked_me.clear();
classic_mons.clear();
- required_features = mon->apply_compatset_features_to_quorum_requirements();
init();
// start by trying to elect me
int from = m->get_source().num();
assert(m->epoch % 2 == 1); // election
+ uint64_t required_features = mon->get_required_features();
if ((required_features ^ m->get_connection()->get_features()) &
required_features) {
dout(5) << " ignoring propose from mon" << from
return;
}
assert(m->epoch == epoch);
+ uint64_t required_features = mon->get_required_features();
if ((required_features ^ m->get_connection()->get_features()) &
required_features) {
dout(5) << " ignoring ack from mon" << from
uint64_t supported_features = m->get_connection()->get_features();
if (supported_features & CEPH_FEATURE_OSDMAP_ENC) {
- uint64_t required_features = mon->apply_compatset_features_to_quorum_requirements();
+ uint64_t required_features = mon->get_required_features();
dout(10) << "sending nak to peer " << m->get_source()
<< " that only supports " << supported_features
<< " of the required " << required_features << dendl;
*/
map<int, uint64_t> acked_me;
set<int> classic_mons;
- /// features which a monitor must hold for us to defer to them
- uint64_t required_features;
/**
* @}
*/
epoch(0),
participating(true),
electing_me(false),
- required_features(0),
leader_acked(-1) { }
/**
bump_epoch(epoch + 1);
}
- /**
- * Refresh required features
- *
- * Force a refresh of the features we require for others to join in
- * on an election.
- */
- void refresh_required_features();
-
/**
* Handle received messages.
*
state(STATE_PROBING),
elector(this),
+ required_features(0),
leader(0),
quorum_features(0),
scrub_version(0),
{
read_features_off_disk(store, &features);
dout(10) << "features " << features << dendl;
+
+ apply_compatset_features_to_quorum_requirements();
+ dout(10) << "required_features " << required_features << dendl;
}
void Monitor::write_features(MonitorDBStore::Transaction &t)
assert(g_conf->mon_sync_provider_kill_at != 1);
// make sure they can understand us.
- uint64_t required = apply_compatset_features_to_quorum_requirements();
- if ((required ^ m->get_connection()->get_features()) & required) {
+ if ((required_features ^ m->get_connection()->get_features()) &
+ required_features) {
dout(5) << " ignoring peer mon." << m->get_source().num()
<< " has features " << std::hex
<< m->get_connection()->get_features()
- << " but we require " << required << std::dec << dendl;
+ << " but we require " << required_features << std::dec << dendl;
return;
}
if (new_features.compare(features) != 0) {
CompatSet diff = features.unsupported(new_features);
- dout(1) << "Enabling new quorum features: " << diff << dendl;
+ dout(1) << __func__ << " enabling new quorum features: " << diff << dendl;
features = new_features;
+
MonitorDBStore::Transaction t;
write_features(t);
store->apply_transaction(t);
- elector.refresh_required_features();
+ apply_compatset_features_to_quorum_requirements();
}
}
-uint64_t Monitor::apply_compatset_features_to_quorum_requirements()
+void Monitor::apply_compatset_features_to_quorum_requirements()
{
- uint64_t required_features = 0;
+ required_features = 0;
if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_OSD_ERASURE_CODES)) {
required_features |= CEPH_FEATURE_OSD_ERASURE_CODES;
}
if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_OSDMAP_ENC)) {
required_features |= CEPH_FEATURE_OSDMAP_ENC;
}
- return required_features;
+ dout(10) << __func__ << " required_features " << required_features << dendl;
}
void Monitor::sync_force(Formatter *f, ostream& ss)
Paxos *paxos;
Elector elector;
friend class Elector;
+
+ /// features we require of peers (based on on-disk compatset)
+ uint64_t required_features;
int leader; // current leader (to best of knowledge)
set<int> quorum; // current active set of monitors (if !starting)
uint64_t get_quorum_features() const {
return quorum_features;
}
+ uint64_t get_required_features() const {
+ return quorum_features;
+ }
void apply_quorum_to_compatset_features();
- uint64_t apply_compatset_features_to_quorum_requirements();
+ void apply_compatset_features_to_quorum_requirements();
private:
void _reset(); ///< called from bootstrap, start_, or join_election