Add SHUTDOWN state. Ignore any msgr callbacks if set.
Fixes crash like
2012-02-18T21:57:58.912 INFO:teuthology.task.ceph:Shutting down mon daemons...
2012-02-18T21:57:58.912 DEBUG:teuthology.task.ceph.mon.a:waiting for process to exit
2012-02-18T21:57:58.913 INFO:teuthology.task.ceph.mon.a.err:2012-02-18 21:57:58.927759
7fe98dfa1700 mon.a@1(peon) e1 *** Got Signal Terminated ***
2012-02-18T21:57:59.014 INFO:teuthology.task.ceph.mon.a.err:*** Caught signal (Segmentation fault) **
2012-02-18T21:57:59.014 INFO:teuthology.task.ceph.mon.a.err: in thread
7fe98d7a0700
2012-02-18T21:57:59.014 INFO:teuthology.task.ceph.mon.a.err: ceph version
0.41-382-gc1db900 (commit:
c1db9009c2cde9dc7ab8857b0d28a1b6d931e98a)
2012-02-18T21:57:59.015 INFO:teuthology.task.ceph.mon.a.err: 1: /tmp/cephtest/binary/usr/local/bin/ceph-mon() [0x5b0871]
2012-02-18T21:57:59.015 INFO:teuthology.task.ceph.mon.a.err: 2: (()+0xfb40) [0x7fe991a1eb40]
2012-02-18T21:57:59.015 INFO:teuthology.task.ceph.mon.a.err: 3: (PerfCounters::set(int, unsigned long)+0x1a) [0x52008a]
2012-02-18T21:57:59.015 INFO:teuthology.task.ceph.mon.a.err: 4: (PGMonitor::update_logger()+0x96) [0x4d4bf6]
2012-02-18T21:57:59.015 INFO:teuthology.task.ceph.mon.a.err: 5: (PGMonitor::update_from_paxos()+0xa70) [0x4e0980]
2012-02-18T21:57:59.016 INFO:teuthology.task.ceph.mon.a.err: 6: (Monitor::_ms_dispatch(Message*)+0x143b) [0x47bd6b]
2012-02-18T21:57:59.016 INFO:teuthology.task.ceph.mon.a.err: 7: (Monitor::ms_dispatch(Message*)+0x90) [0x489210]
2012-02-18T21:57:59.016 INFO:teuthology.task.ceph.mon.a.err: 8: (SimpleMessenger::dispatch_entry()+0x89a) [0x53959a]
2012-02-18T21:57:59.016 INFO:teuthology.task.ceph.mon.a.err: 9: (SimpleMessenger::DispatchThread::entry()+0x1c) [0x46358c]
2012-02-18T21:57:59.016 INFO:teuthology.task.ceph.mon.a.err: 10: (()+0x7971) [0x7fe991a16971]
2012-02-18T21:57:59.017 INFO:teuthology.task.ceph.mon.a.err: 11: (clone()+0x6d) [0x7fe9902a592d]
which is analogous to #2014.
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
{
dout(1) << "shutdown" << dendl;
+ state = STATE_SHUTDOWN;
+
if (admin_hook) {
AdminSocket* admin_socket = cct->get_admin_socket();
admin_socket->unregister_command("mon_status");
{
bool ret = true;
+ if (state == STATE_SHUTDOWN)
+ return false;
+
Connection *connection = m->get_connection();
MonSession *s = NULL;
bool reuse_caps = false;
{
dout(10) << "ms_handle_reset " << con << " " << con->get_peer_addr() << dendl;
+ if (state == STATE_SHUTDOWN)
+ return false;
+
// ignore lossless monitor sessions
if (con->get_peer_type() == CEPH_ENTITY_TYPE_MON)
return false;
{
dout(10) << "ms_get_authorizer for " << ceph_entity_type_name(service_id) << dendl;
+ if (state == STATE_SHUTDOWN)
+ return false;
+
// we only connect to other monitors; every else connects to us.
if (service_id != CEPH_ENTITY_TYPE_MON)
return false;
<< " " << ceph_entity_type_name(peer_type)
<< " protocol " << protocol << dendl;
+ if (state == STATE_SHUTDOWN)
+ return false;
+
if (peer_type == CEPH_ENTITY_TYPE_MON &&
auth_supported.is_supported_auth(CEPH_AUTH_CEPHX)) {
// monitor, and cephx is enabled
STATE_SLURPING,
STATE_ELECTING,
STATE_LEADER,
- STATE_PEON
+ STATE_PEON,
+ STATE_SHUTDOWN
};
int state;