out << p->first << "=" << p->second.public_addrs;
has_printed = true;
}
- out << "}";
+ out << "}" << " removed_ranks: {" << removed_ranks << "}";
}
void MonMap::print(ostream& out) const
f->dump_stream("disallowed_leaders: ") << disallowed_leaders;
f->dump_bool("stretch_mode", stretch_mode_enabled);
f->dump_string("tiebreaker_mon", tiebreaker_mon);
+ f->dump_stream("removed_ranks: ") << removed_ranks;
f->open_object_section("features");
persistent_features.dump(f, "persistent");
optional_features.dump(f, "optional");
!has_ever_joined)) {
dout(10) << " got newer/committed monmap epoch " << newmap->get_epoch()
<< ", mine was " << monmap->get_epoch() << dendl;
+ int epoch_diff = newmap->get_epoch() - monmap->get_epoch();
delete newmap;
monmap->decode(m->monmap_bl);
- notify_new_monmap(false);
-
+ dout(20) << "has_ever_joined: " << has_ever_joined << dendl;
+ if (epoch_diff == 1 && has_ever_joined) {
+ notify_new_monmap(false);
+ } else {
+ notify_new_monmap(false, false);
+ elector.notify_clear_peer_state();
+ }
bootstrap();
return;
}
need_set_crush_loc = true;
}
-void Monitor::notify_new_monmap(bool can_change_external_state)
+void Monitor::notify_new_monmap(bool can_change_external_state, bool remove_rank_elector)
{
if (need_set_crush_loc) {
auto my_info_i = monmap->mon_info.find(name);
}
}
elector.notify_strategy_maybe_changed(monmap->strategy);
- dout(30) << __func__ << "we have " << monmap->removed_ranks.size() << " removed ranks" << dendl;
- for (auto i = monmap->removed_ranks.rbegin();
- i != monmap->removed_ranks.rend(); ++i) {
- int rank = *i;
- dout(10) << __func__ << "removing rank " << rank << dendl;
- elector.notify_rank_removed(rank);
+ if (remove_rank_elector){
+ dout(10) << __func__ << " we have " << monmap->ranks.size()<< " ranks" << dendl;
+ dout(10) << __func__ << " we have " << monmap->removed_ranks.size() << " removed ranks" << dendl;
+ for (auto i = monmap->removed_ranks.rbegin();
+ i != monmap->removed_ranks.rend(); ++i) {
+ int rank = *i;
+ dout(10) << __func__ << " removing rank " << rank << dendl;
+ int new_rank = monmap->get_rank(messenger->get_myaddrs());
+ elector.notify_rank_removed(rank, new_rank);
+ }
}
if (monmap->stretch_mode_enabled) {
/** can_change_external_state if we can do things like
* call elections as a result of the new map.
*/
- void notify_new_monmap(bool can_change_external_state=false);
+ void notify_new_monmap(bool can_change_external_state=false, bool remove_rank_elector=true);
public:
struct C_Command : public C_MonOp {
pending_map = *mon.monmap;
pending_map.epoch++;
pending_map.last_changed = ceph_clock_now();
- dout(10) << __func__ << " monmap epoch " << pending_map.epoch << dendl;
+ pending_map.removed_ranks.clear();
}
void MonmapMonitor::encode_pending(MonitorDBStore::TransactionRef t)
pending_map.remove(name);
pending_map.disallowed_leaders.erase(name);
pending_map.last_changed = ceph_clock_now();
- ss << "removing mon." << name << " at " << addrs
- << ", there will be " << pending_map.size() << " monitors" ;
propose = true;
err = 0;