From f06c4dc1d093c25f70a1465045082440abfcbe3c Mon Sep 17 00:00:00 2001 From: John Spray Date: Tue, 9 Feb 2016 12:15:56 +0000 Subject: [PATCH] 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 --- src/osdc/Objecter.cc | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 9ace054ca0c0..8a6f1e659e0c 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, -- 2.47.3