From 29c6f9adf178f6611a625740f395e397cad9147b Mon Sep 17 00:00:00 2001 From: John Spray Date: Thu, 7 Sep 2017 09:44:36 -0400 Subject: [PATCH] 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 --- src/mon/MgrMonitor.cc | 13 ++++++++----- src/mon/MgrMonitor.h | 11 ++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/mon/MgrMonitor.cc b/src/mon/MgrMonitor.cc index ae501b3593d9c..cc0ffe673d73f 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 393211c204732..de07d7f430248 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(); -- 2.39.5