C_OnFinisher *wrap_finisher(Context *c);
public:
- Journaler(inodeno_t ino_, int64_t pool, const char *mag, Objecter *obj, PerfCounters *l, int lkey, SafeTimer *tim, Finisher *f=NULL) :
+ Journaler(inodeno_t ino_, int64_t pool, const char *mag, Objecter *obj, PerfCounters *l, int lkey, SafeTimer *tim, Finisher *f) :
last_committed(mag),
cct(obj->cct), lock("Journaler"), finisher(f),
last_written(mag),
int r = 0;
Journaler journaler(ino, mdsmap->get_metadata_pool(), CEPH_FS_ONDISK_MAGIC,
- objecter, 0, 0, &timer);
+ objecter, 0, 0, &timer, &finisher);
r = recover_journal(&journaler);
if (r) {
return;
objecter(NULL),
lock("MDSUtility::lock"),
timer(g_ceph_context, lock),
+ finisher(g_ceph_context, "MDSUtility"),
waiting_for_mds_map(NULL)
{
monc = new MonClient(g_ceph_context);
if (r < 0)
return r;
- messenger->add_dispatcher_head(this);
messenger->start();
+ objecter->set_client_incarnation(0);
+ objecter->init();
+
+ // Connect dispatchers before starting objecter
+ messenger->add_dispatcher_tail(objecter);
+ messenger->add_dispatcher_tail(this);
+
// Initialize MonClient
if (monc->build_initial_monmap() < 0) {
+ objecter->shutdown();
messenger->shutdown();
messenger->wait();
return -1;
if (r < 0) {
derr << "Authentication failed, did you specify an MDS ID with a valid keyring?" << dendl;
monc->shutdown();
+ objecter->shutdown();
messenger->shutdown();
messenger->wait();
return r;
client_t whoami = monc->get_global_id();
messenger->set_myname(entity_name_t::CLIENT(whoami.v));
- // Initialize Objecter and wait for OSD map
- objecter->set_client_incarnation(0);
- objecter->init();
+ // Start Objecter and wait for OSD map
+ objecter->start();
objecter->wait_for_osd_map();
timer.init();
init_lock.Unlock();
dout(4) << "Got MDS map " << mdsmap->get_epoch() << dendl;
+ finisher.start();
+
return 0;
}
void MDSUtility::shutdown()
{
+ finisher.stop();
+
lock.Lock();
timer.shutdown();
objecter->shutdown();
{
Mutex::Locker locker(lock);
switch (m->get_type()) {
- case CEPH_MSG_OSD_OPREPLY:
- objecter->handle_osd_op_reply((MOSDOpReply *)m);
- break;
- case CEPH_MSG_OSD_MAP:
- objecter->handle_osd_map((MOSDMap*)m);
- break;
case CEPH_MSG_MDS_MAP:
handle_mds_map((MMDSMap*)m);
break;
+ case CEPH_MSG_OSD_MAP:
+ break;
default:
return false;
}
#include "msg/Dispatcher.h"
#include "msg/Messenger.h"
#include "auth/Auth.h"
+#include "common/Finisher.h"
/// MDS Utility
/**
Mutex lock;
SafeTimer timer;
+ Finisher finisher;
Context *waiting_for_mds_map;
Journaler journaler(jp.front,
mdsmap->get_metadata_pool(),
CEPH_FS_ONDISK_MAGIC,
- objecter, 0, 0, &timer);
+ objecter, 0, 0, &timer, &finisher);
lock.Lock();
journaler.recover(new C_SafeCond(&mylock, &cond, &done, &r));