From: Joao Eduardo Luis Date: Thu, 10 Apr 2014 14:14:19 +0000 (+0100) Subject: mon: Monitor: suicide on start if mon has been removed from monmap X-Git-Tag: v0.80-rc1~66^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F1624%2Fhead;p=ceph.git 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 --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index ff674cfc19b7..935a4836edf8 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 7e29e14cd2f5..525d12e14d57 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; + } } {