public:
explicit AdminHook(Monitor *m) : mon(m) {}
int call(std::string_view command, const cmdmap_t& cmdmap,
+ const bufferlist&,
Formatter *f,
std::ostream& errss,
bufferlist& out) override {
osdmon()->get_filestore_osd_list();
state = STATE_PROBING;
+
bootstrap();
+
+ if (!elector.peer_tracker_is_clean()){
+ dout(10) << "peer_tracker looks inconsistent"
+ << " previous bad logic, clearing ..." << dendl;
+ elector.notify_clear_peer_state();
+ }
+
// add features of myself into feature_map
session_map.feature_map.add_mon(con_self->get_features());
return 0;
!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;
}
const std::string current_version = mon_metadata[rank]["ceph_version_short"];
const std::string pending_version = metadata["ceph_version_short"];
- if (current_version.compare(0, version_size, pending_version) < 0) {
+ if (current_version.compare(0, version_size, pending_version) != 0) {
mgr_client.update_daemon_metadata("mon", name, metadata);
}
}
// Catch bad_cmd_get exception if _generate_command_map() throws it
try {
_generate_command_map(cmdmap, param_str_map);
- }
- catch(bad_cmd_get& e) {
+ } catch (const bad_cmd_get& e) {
reply_command(op, -EINVAL, e.what(), 0);
+ return;
}
if (!_allowed_command(session, service, prefix, cmdmap,
rs = "";
r = 0;
} else if (prefix == "report") {
-
+ // some of the report data is only known by leader, e.g. osdmap_clean_epochs
+ if (!is_leader() && !is_peon()) {
+ dout(10) << " waiting for quorum" << dendl;
+ waitfor_quorum.push_back(new C_RetryMessage(this, op));
+ return;
+ }
+ if (!is_leader()) {
+ forward_request_leader(op);
+ return;
+ }
// this must be formatted, in its current form
if (!f)
f.reset(Formatter::create("json-pretty"));
switch (op->get_req()->get_type()) {
// auth
case MSG_MON_GLOBAL_ID:
+ case MSG_MON_USED_PENDING_KEYS:
case CEPH_MSG_AUTH:
op->set_type_service();
/* no need to check caps here */
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 remove_rank = *i;
+ dout(10) << __func__ << " removing rank " << remove_rank << dendl;
+ if (rank == remove_rank) {
+ dout(5) << "We are removing our own rank, probably we"
+ << " are removed from monmap before we shutdown ... dropping." << dendl;
+ continue;
+ }
+ int new_rank = monmap->get_rank(messenger->get_myaddrs());
+ if (new_rank == -1) {
+ dout(5) << "We no longer exists in the monmap! ... dropping." << dendl;
+ continue;
+ }
+ elector.notify_rank_removed(remove_rank, new_rank);
+ }
}
if (monmap->stretch_mode_enabled) {