mon: move required_features back into Monitor

This is simpler and cleaner.

Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Sage Weil 2014-04-09 15:27:20 -07:00
parent c8039ab857
commit 39ca440bfd
4 changed files with 23 additions and 27 deletions

View File

@ -65,11 +65,6 @@ void Elector::bump_epoch(epoch_t e)
}
void Elector::refresh_required_features()
{
required_features = mon->apply_compatset_features_to_quorum_requirements();
}
void Elector::start()
{
if (!participating) {
@ -80,7 +75,6 @@ void Elector::start()
acked_me.clear();
classic_mons.clear();
required_features = mon->apply_compatset_features_to_quorum_requirements();
init();
// start by trying to elect me
@ -219,6 +213,7 @@ void Elector::handle_propose(MMonElection *m)
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
@ -283,6 +278,7 @@ void Elector::handle_ack(MMonElection *m)
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
@ -360,7 +356,7 @@ void Elector::nak_old_peer(MMonElection *m)
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;

View File

@ -115,8 +115,6 @@ class Elector {
*/
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;
/**
* @}
*/
@ -354,7 +352,6 @@ class Elector {
epoch(0),
participating(true),
electing_me(false),
required_features(0),
leader_acked(-1) { }
/**
@ -391,14 +388,6 @@ class Elector {
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.
*

View File

@ -156,6 +156,7 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s,
state(STATE_PROBING),
elector(this),
required_features(0),
leader(0),
quorum_features(0),
scrub_version(0),
@ -364,6 +365,9 @@ void Monitor::read_features()
{
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)
@ -1086,12 +1090,12 @@ void Monitor::handle_sync_get_cookie(MMonSync *m)
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;
}
@ -1671,26 +1675,27 @@ void Monitor::apply_quorum_to_compatset_features()
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)

View File

@ -195,6 +195,9 @@ private:
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)
@ -525,8 +528,11 @@ public:
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