}
};
+namespace librados {
+struct C_AioComplete : public Context {
+ AioCompletionImpl *c;
+
+ C_AioComplete(AioCompletionImpl *cc) : c(cc) {
+ c->ref++;
+ }
+
+ void finish(int r) {
+ rados_callback_t cb = c->callback_complete;
+ void *cb_arg = c->callback_arg;
+ cb(c, cb_arg);
+ c->put();
+ }
+};
+
+struct C_AioSafe : public Context {
+ AioCompletionImpl *c;
+
+ C_AioSafe(AioCompletionImpl *cc) : c(cc) {
+ c->ref++;
+ }
+
+ void finish(int r) {
+ rados_callback_t cb = c->callback_safe;
+ void *cb_arg = c->callback_arg;
+ cb(c, cb_arg);
+ c->put();
+ }
+};
+
+}
+
#endif
}
if (c->callback_complete) {
- rados_callback_t cb = c->callback_complete;
- void *cb_arg = c->callback_arg;
- c->lock.Unlock();
- cb(c, cb_arg);
- c->lock.Lock();
+ c->io->client->finisher.queue(new C_AioComplete(c));
}
c->put_unlock();
}
if (c->callback_complete) {
- rados_callback_t cb = c->callback_complete;
- void *cb_arg = c->callback_arg;
- c->lock.Unlock();
- cb(c, cb_arg);
- c->lock.Lock();
+ c->io->client->finisher.queue(new C_AioComplete(c));
}
c->put_unlock();
c->cond.Signal();
if (c->callback_safe) {
- rados_callback_t cb = c->callback_safe;
- void *cb_arg = c->callback_arg;
- c->lock.Unlock();
- cb(c, cb_arg);
- c->lock.Lock();
+ c->io->client->finisher.queue(new C_AioSafe(c));
}
c->io->complete_aio_write(c);
return *authorizer != NULL;
}
-librados::RadosClient::RadosClient(CephContext *cct_) : Dispatcher(cct_),
- cct(cct_),
- conf(cct_->_conf),
- state(DISCONNECTED),
- monclient(cct_),
- messenger(NULL),
- objecter(NULL),
- lock("radosclient"),
- timer(cct, lock),
- max_watch_cookie(0)
+librados::RadosClient::RadosClient(CephContext *cct_)
+ : Dispatcher(cct_),
+ cct(cct_),
+ conf(cct_->_conf),
+ state(DISCONNECTED),
+ monclient(cct_),
+ messenger(NULL),
+ objecter(NULL),
+ lock("radosclient"),
+ timer(cct, lock),
+ finisher(cct),
+ max_watch_cookie(0)
{
}
ldout(cct, 1) << "waiting for osdmap" << dendl;
cond.Wait(lock);
}
+
+ finisher.start();
+
state = CONNECTED;
+
lock.Unlock();
ldout(cct, 1) << "init done" << dendl;
lock.Unlock();
return;
}
+ if (state == CONNECTED) {
+ finisher.stop();
+ }
monclient.shutdown();
if (objecter && state == CONNECTED)
objecter->shutdown();
SafeTimer timer;
public:
+ Finisher finisher;
RadosClient(CephContext *cct_);
~RadosClient();