mirror of
https://github.com/ceph/ceph
synced 2025-03-05 15:58:41 +00:00
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:
parent
c8039ab857
commit
39ca440bfd
@ -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;
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user