mirror of
https://github.com/ceph/ceph
synced 2025-04-26 04:39:32 +00:00
objecter: separate locked and unlocked init/shutdown
We don't want to hold the lock while we register the admin socket commands or else we create a lock cycle when we try to process them later. Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
7926ef5393
commit
4db9442bad
@ -181,12 +181,13 @@ int librados::RadosClient::connect()
|
|||||||
}
|
}
|
||||||
messenger->set_myname(entity_name_t::CLIENT(monclient.get_global_id()));
|
messenger->set_myname(entity_name_t::CLIENT(monclient.get_global_id()));
|
||||||
|
|
||||||
|
objecter->init_unlocked();
|
||||||
lock.Lock();
|
lock.Lock();
|
||||||
|
|
||||||
timer.init();
|
timer.init();
|
||||||
|
|
||||||
objecter->set_client_incarnation(0);
|
objecter->set_client_incarnation(0);
|
||||||
objecter->init();
|
objecter->init_locked();
|
||||||
monclient.renew_subs();
|
monclient.renew_subs();
|
||||||
|
|
||||||
while (osdmap.get_epoch() == 0) {
|
while (osdmap.get_epoch() == 0) {
|
||||||
@ -220,11 +221,16 @@ void librados::RadosClient::shutdown()
|
|||||||
finisher.stop();
|
finisher.stop();
|
||||||
}
|
}
|
||||||
monclient.shutdown();
|
monclient.shutdown();
|
||||||
if (objecter && state == CONNECTED)
|
bool need_objecter = false;
|
||||||
objecter->shutdown();
|
if (objecter && state == CONNECTED) {
|
||||||
|
need_objecter = true;
|
||||||
|
objecter->shutdown_locked();
|
||||||
|
}
|
||||||
state = DISCONNECTED;
|
state = DISCONNECTED;
|
||||||
timer.shutdown(); // will drop+retake lock
|
timer.shutdown(); // will drop+retake lock
|
||||||
lock.Unlock();
|
lock.Unlock();
|
||||||
|
if (need_objecter)
|
||||||
|
objecter->shutdown_unlocked();
|
||||||
if (messenger) {
|
if (messenger) {
|
||||||
messenger->shutdown();
|
messenger->shutdown();
|
||||||
messenger->wait();
|
messenger->wait();
|
||||||
|
@ -66,8 +66,9 @@ void Dumper::init(int rank)
|
|||||||
client_t whoami = monc->get_global_id();
|
client_t whoami = monc->get_global_id();
|
||||||
messenger->set_myname(entity_name_t::CLIENT(whoami.v));
|
messenger->set_myname(entity_name_t::CLIENT(whoami.v));
|
||||||
|
|
||||||
|
objecter->init_unlocked();
|
||||||
lock.Lock();
|
lock.Lock();
|
||||||
objecter->init();
|
objecter->init_locked();
|
||||||
objecter->wait_for_osd_map();
|
objecter->wait_for_osd_map();
|
||||||
timer.init();
|
timer.init();
|
||||||
lock.Unlock();
|
lock.Unlock();
|
||||||
@ -77,7 +78,9 @@ void Dumper::shutdown()
|
|||||||
{
|
{
|
||||||
lock.Lock();
|
lock.Lock();
|
||||||
timer.shutdown();
|
timer.shutdown();
|
||||||
|
objecter->shutdown_locked();
|
||||||
lock.Unlock();
|
lock.Unlock();
|
||||||
|
objecter->shutdown_unlocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dumper::dump(const char *dump_file)
|
void Dumper::dump(const char *dump_file)
|
||||||
|
@ -462,6 +462,8 @@ int MDS::init(int wanted_state)
|
|||||||
monc->authenticate();
|
monc->authenticate();
|
||||||
monc->wait_auth_rotating(30.0);
|
monc->wait_auth_rotating(30.0);
|
||||||
|
|
||||||
|
objecter->init_unlocked();
|
||||||
|
|
||||||
mds_lock.Lock();
|
mds_lock.Lock();
|
||||||
if (want_state == CEPH_MDS_STATE_DNE) {
|
if (want_state == CEPH_MDS_STATE_DNE) {
|
||||||
mds_lock.Unlock();
|
mds_lock.Unlock();
|
||||||
@ -505,7 +507,7 @@ int MDS::init(int wanted_state)
|
|||||||
whoami = -1;
|
whoami = -1;
|
||||||
messenger->set_myname(entity_name_t::MDS(whoami));
|
messenger->set_myname(entity_name_t::MDS(whoami));
|
||||||
|
|
||||||
objecter->init();
|
objecter->init_locked();
|
||||||
|
|
||||||
monc->sub_want("mdsmap", 0, 0);
|
monc->sub_want("mdsmap", 0, 0);
|
||||||
monc->renew_subs();
|
monc->renew_subs();
|
||||||
@ -1560,7 +1562,7 @@ void MDS::suicide()
|
|||||||
// shut down cache
|
// shut down cache
|
||||||
mdcache->shutdown();
|
mdcache->shutdown();
|
||||||
|
|
||||||
objecter->shutdown();
|
objecter->shutdown_locked();
|
||||||
|
|
||||||
// shut down messenger
|
// shut down messenger
|
||||||
messenger->shutdown();
|
messenger->shutdown();
|
||||||
|
@ -76,8 +76,9 @@ void Resetter::init(int rank)
|
|||||||
client_t whoami = monc->get_global_id();
|
client_t whoami = monc->get_global_id();
|
||||||
messenger->set_myname(entity_name_t::CLIENT(whoami.v));
|
messenger->set_myname(entity_name_t::CLIENT(whoami.v));
|
||||||
|
|
||||||
|
objecter->init_unlocked();
|
||||||
lock.Lock();
|
lock.Lock();
|
||||||
objecter->init();
|
objecter->init_locked();
|
||||||
objecter->wait_for_osd_map();
|
objecter->wait_for_osd_map();
|
||||||
timer.init();
|
timer.init();
|
||||||
lock.Unlock();
|
lock.Unlock();
|
||||||
@ -87,7 +88,9 @@ void Resetter::shutdown()
|
|||||||
{
|
{
|
||||||
lock.Lock();
|
lock.Lock();
|
||||||
timer.shutdown();
|
timer.shutdown();
|
||||||
|
objecter->shutdown_locked();
|
||||||
lock.Unlock();
|
lock.Unlock();
|
||||||
|
objecter->shutdown_unlocked();
|
||||||
messenger->shutdown();
|
messenger->shutdown();
|
||||||
messenger->wait();
|
messenger->wait();
|
||||||
}
|
}
|
||||||
|
@ -121,9 +121,8 @@ enum {
|
|||||||
|
|
||||||
// messages ------------------------------
|
// messages ------------------------------
|
||||||
|
|
||||||
void Objecter::init()
|
void Objecter::init_unlocked()
|
||||||
{
|
{
|
||||||
assert(client_lock.is_locked());
|
|
||||||
assert(!initialized);
|
assert(!initialized);
|
||||||
|
|
||||||
if (!logger) {
|
if (!logger) {
|
||||||
@ -209,6 +208,12 @@ void Objecter::init()
|
|||||||
lderr(cct) << "error registering admin socket command: "
|
lderr(cct) << "error registering admin socket command: "
|
||||||
<< cpp_strerror(-ret) << dendl;
|
<< cpp_strerror(-ret) << dendl;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Objecter::init_locked()
|
||||||
|
{
|
||||||
|
assert(client_lock.is_locked());
|
||||||
|
assert(!initialized);
|
||||||
|
|
||||||
schedule_tick();
|
schedule_tick();
|
||||||
maybe_request_map();
|
maybe_request_map();
|
||||||
@ -216,7 +221,7 @@ void Objecter::init()
|
|||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Objecter::shutdown()
|
void Objecter::shutdown_locked()
|
||||||
{
|
{
|
||||||
assert(client_lock.is_locked());
|
assert(client_lock.is_locked());
|
||||||
assert(initialized);
|
assert(initialized);
|
||||||
@ -232,7 +237,10 @@ void Objecter::shutdown()
|
|||||||
timer.cancel_event(tick_event);
|
timer.cancel_event(tick_event);
|
||||||
tick_event = NULL;
|
tick_event = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Objecter::shutdown_unlocked()
|
||||||
|
{
|
||||||
if (m_request_state_hook) {
|
if (m_request_state_hook) {
|
||||||
AdminSocket* admin_socket = cct->get_admin_socket();
|
AdminSocket* admin_socket = cct->get_admin_socket();
|
||||||
admin_socket->unregister_command("objecter_requests");
|
admin_socket->unregister_command("objecter_requests");
|
||||||
|
@ -969,8 +969,10 @@ public:
|
|||||||
assert(!logger);
|
assert(!logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init();
|
void init_unlocked();
|
||||||
void shutdown();
|
void init_locked();
|
||||||
|
void shutdown_locked();
|
||||||
|
void shutdown_unlocked();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell the objecter to throttle outgoing ops according to its
|
* Tell the objecter to throttle outgoing ops according to its
|
||||||
|
Loading…
Reference in New Issue
Block a user