}
messenger->set_myname(entity_name_t::CLIENT(monclient.get_global_id()));
+ objecter->init_unlocked();
lock.Lock();
timer.init();
objecter->set_client_incarnation(0);
- objecter->init();
+ objecter->init_locked();
monclient.renew_subs();
while (osdmap.get_epoch() == 0) {
finisher.stop();
}
monclient.shutdown();
- if (objecter && state == CONNECTED)
- objecter->shutdown();
+ bool need_objecter = false;
+ if (objecter && state == CONNECTED) {
+ need_objecter = true;
+ objecter->shutdown_locked();
+ }
state = DISCONNECTED;
timer.shutdown(); // will drop+retake lock
lock.Unlock();
+ if (need_objecter)
+ objecter->shutdown_unlocked();
if (messenger) {
messenger->shutdown();
messenger->wait();
client_t whoami = monc->get_global_id();
messenger->set_myname(entity_name_t::CLIENT(whoami.v));
+ objecter->init_unlocked();
lock.Lock();
- objecter->init();
+ objecter->init_locked();
objecter->wait_for_osd_map();
timer.init();
lock.Unlock();
{
lock.Lock();
timer.shutdown();
+ objecter->shutdown_locked();
lock.Unlock();
+ objecter->shutdown_unlocked();
}
void Dumper::dump(const char *dump_file)
monc->authenticate();
monc->wait_auth_rotating(30.0);
+ objecter->init_unlocked();
+
mds_lock.Lock();
if (want_state == CEPH_MDS_STATE_DNE) {
mds_lock.Unlock();
beacon_start();
whoami = -1;
messenger->set_myname(entity_name_t::MDS(whoami));
-
- objecter->init();
+
+ objecter->init_locked();
monc->sub_want("mdsmap", 0, 0);
monc->renew_subs();
// shut down cache
mdcache->shutdown();
- objecter->shutdown();
+ objecter->shutdown_locked();
// shut down messenger
messenger->shutdown();
client_t whoami = monc->get_global_id();
messenger->set_myname(entity_name_t::CLIENT(whoami.v));
+ objecter->init_unlocked();
lock.Lock();
- objecter->init();
+ objecter->init_locked();
objecter->wait_for_osd_map();
timer.init();
lock.Unlock();
{
lock.Lock();
timer.shutdown();
+ objecter->shutdown_locked();
lock.Unlock();
+ objecter->shutdown_unlocked();
messenger->shutdown();
messenger->wait();
}
// messages ------------------------------
-void Objecter::init()
+void Objecter::init_unlocked()
{
- assert(client_lock.is_locked());
assert(!initialized);
if (!logger) {
lderr(cct) << "error registering admin socket command: "
<< cpp_strerror(-ret) << dendl;
}
+}
+
+void Objecter::init_locked()
+{
+ assert(client_lock.is_locked());
+ assert(!initialized);
schedule_tick();
maybe_request_map();
initialized = true;
}
-void Objecter::shutdown()
+void Objecter::shutdown_locked()
{
assert(client_lock.is_locked());
assert(initialized);
timer.cancel_event(tick_event);
tick_event = NULL;
}
+}
+void Objecter::shutdown_unlocked()
+{
if (m_request_state_hook) {
AdminSocket* admin_socket = cct->get_admin_socket();
admin_socket->unregister_command("objecter_requests");
assert(!logger);
}
- void init();
- void shutdown();
+ void init_unlocked();
+ void init_locked();
+ void shutdown_locked();
+ void shutdown_unlocked();
/**
* Tell the objecter to throttle outgoing ops according to its