From 86b85947a2148c2e73886c1a7edd09093966ada0 Mon Sep 17 00:00:00 2001 From: Joao Eduardo Luis Date: Thu, 10 Apr 2014 15:14:19 +0100 Subject: [PATCH] mon: Monitor: suicide on start if mon has been removed from monmap If the monitor has been marked as having been part of an existing quorum and is no longer in the monmap, then it is safe to assume the monitor was removed from the monmap. In that event, do not allow the monitor to start, as it will try to find its way into the quorum again (and someone clearly stated they don't really want them there), unless 'mon force quorum join' is specified. Fixes: 6789 Backport: dumpling, emperor Signed-off-by: Joao Eduardo Luis --- src/common/config_opts.h | 1 + src/mon/Monitor.cc | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index ff674cfc19b7e..935a4836edf80 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -219,6 +219,7 @@ OPTION(mon_leveldb_compression, OPT_BOOL, false) // monitor's leveldb uses compr OPTION(mon_leveldb_paranoid, OPT_BOOL, false) // monitor's leveldb paranoid flag OPTION(mon_leveldb_log, OPT_STR, "") OPTION(mon_leveldb_size_warn, OPT_U64, 40*1024*1024*1024) // issue a warning when the monitor's leveldb goes over 40GB (in bytes) +OPTION(mon_force_quorum_join, OPT_BOOL, false) // force monitor to join quorum even if it has been previously removed from the map OPTION(paxos_stash_full_interval, OPT_INT, 25) // how often (in commits) to stash a full copy of the PaxosService state OPTION(paxos_max_join_drift, OPT_INT, 10) // max paxos iterations before we must first sync the monitor stores OPTION(paxos_propose_interval, OPT_DOUBLE, 1.0) // gather updates for this long before proposing a map update diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 7e29e14cd2f5d..525d12e14d574 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -447,6 +447,16 @@ int Monitor::preinit() dout(10) << " monmap is " << *monmap << dendl; dout(10) << " extra probe peers " << extra_probe_peers << dendl; } + } else if (!monmap->contains(name)) { + derr << "not in monmap and have been in a quorum before; " + << "must have been removed" << dendl; + if (g_conf->mon_force_quorum_join) { + dout(0) << "we should have died but " + << "'mon_force_quorum_join' is set -- allowing boot" << dendl; + } else { + derr << "commit suicide!" << dendl; + return -ENOENT; + } } { -- 2.39.5