From: John Spray Date: Tue, 9 Feb 2016 12:15:56 +0000 (+0000) Subject: osdc/Objecter: drop lock to unregister asok hooks X-Git-Tag: v10.1.0~406^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F7581%2Fhead;p=ceph.git osdc/Objecter: drop lock to unregister asok hooks unregister blocks until any running hook has completed, and that running hook might be one that takes the objecter lock, so you can't hold it while unregistering. Signed-off-by: John Spray --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 9ace054ca0c..8a6f1e659e0 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -466,13 +466,6 @@ void Objecter::shutdown() tick_event = 0; } - if (m_request_state_hook) { - AdminSocket* admin_socket = cct->get_admin_socket(); - admin_socket->unregister_command("objecter_requests"); - delete m_request_state_hook; - m_request_state_hook = NULL; - } - if (logger) { cct->get_perfcounters_collection()->remove(logger); delete logger; @@ -481,6 +474,16 @@ void Objecter::shutdown() // Let go of Objecter write lock so timer thread can shutdown wl.unlock(); + + // Outside of lock to avoid cycle WRT calls to RequestStateHook + // This is safe because we guarantee no concurrent calls to + // shutdown() with the ::initialized check at start. + if (m_request_state_hook) { + AdminSocket* admin_socket = cct->get_admin_socket(); + admin_socket->unregister_command("objecter_requests"); + delete m_request_state_hook; + m_request_state_hook = NULL; + } } void Objecter::_send_linger(LingerOp *info,