From: John Spray Date: Thu, 7 Sep 2017 13:44:36 +0000 (-0400) Subject: mon: fix dropping mgr metadata for active mgr X-Git-Tag: v13.0.1~966^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=29c6f9adf178f6611a625740f395e397cad9147b;p=ceph.git mon: fix dropping mgr metadata for active mgr drop_standby() was killing it and it was only getting added back in certain locations. Instead, make the metadata drop conditional and only do it in the places we're really dropping the daemon, not when we're promoting it to active. Fixes: http://tracker.ceph.com/issues/21260 Signed-off-by: John Spray --- diff --git a/src/mon/MgrMonitor.cc b/src/mon/MgrMonitor.cc index ae501b3593d9..cc0ffe673d73 100644 --- a/src/mon/MgrMonitor.cc +++ b/src/mon/MgrMonitor.cc @@ -331,7 +331,7 @@ bool MgrMonitor::prepare_beacon(MonOpRequestRef op) } else if (pending_map.active_gid == 0) { // There is no currently active daemon, select this one. if (pending_map.standbys.count(m->get_gid())) { - drop_standby(m->get_gid()); + drop_standby(m->get_gid(), false); } dout(4) << "selecting new active " << m->get_gid() << " " << m->get_name() @@ -569,7 +569,8 @@ bool MgrMonitor::promote_standby() pending_map.available = false; pending_map.active_addr = entity_addr_t(); - drop_standby(replacement_gid); + drop_standby(replacement_gid, false); + return true; } else { return false; @@ -594,10 +595,12 @@ void MgrMonitor::drop_active() cancel_timer(); } -void MgrMonitor::drop_standby(uint64_t gid) +void MgrMonitor::drop_standby(uint64_t gid, bool drop_meta) { - pending_metadata_rm.insert(pending_map.standbys[gid].name); - pending_metadata.erase(pending_map.standbys[gid].name); + if (drop_meta) { + pending_metadata_rm.insert(pending_map.standbys[gid].name); + pending_metadata.erase(pending_map.standbys[gid].name); + } pending_map.standbys.erase(gid); if (last_beacon.count(gid) > 0) { last_beacon.erase(gid); diff --git a/src/mon/MgrMonitor.h b/src/mon/MgrMonitor.h index 393211c20473..de07d7f43024 100644 --- a/src/mon/MgrMonitor.h +++ b/src/mon/MgrMonitor.h @@ -43,7 +43,16 @@ class MgrMonitor: public PaxosService */ bool promote_standby(); void drop_active(); - void drop_standby(uint64_t gid); + + /** + * Remove this gid from the list of standbys. By default, + * also remove metadata (i.e. forget the daemon entirely). + * + * Set `drop_meta` to false if you would like to keep + * the daemon's metadata, for example if you're dropping + * it as a standby before reinstating it as the active daemon. + */ + void drop_standby(uint64_t gid, bool drop_meta=true); Context *digest_event = nullptr; void cancel_timer();