From: Haomai Wang Date: Fri, 19 Feb 2016 03:26:45 +0000 (+0800) Subject: RadosClient: add async watch_flush version X-Git-Tag: v10.1.0~321^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b651dd7ee669dd9d22ffe86f1acdd6d6f421531e;p=ceph.git RadosClient: add async watch_flush version Signed-off-by: Haomai Wang --- diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 1df66695c811..7b089907bbe7 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -357,7 +357,51 @@ void librados::RadosClient::shutdown() int librados::RadosClient::watch_flush() { ldout(cct, 10) << __func__ << " enter" << dendl; - objecter->linger_callback_flush(); + Mutex mylock("RadosClient::watch_flush::mylock"); + Cond cond; + bool done; + objecter->linger_callback_flush(new C_SafeCond(&mylock, &cond, &done)); + + mylock.Lock(); + while (!done) + cond.Wait(mylock); + mylock.Unlock(); + + ldout(cct, 10) << __func__ << " exit" << dendl; + return 0; +} + +struct C_aio_watch_flush_Complete : public Context { + librados::RadosClient *client; + librados::AioCompletionImpl *c; + + C_aio_watch_flush_Complete(librados::RadosClient *_client, librados::AioCompletionImpl *_c) + : client(_client), c(_c) { + c->get(); + } + + virtual void finish(int r) { + c->lock.Lock(); + c->rval = r; + c->ack = true; + c->safe = true; + c->cond.Signal(); + + if (c->callback_complete) { + client->finisher.queue(new librados::C_AioComplete(c)); + } + if (c->callback_safe) { + client->finisher.queue(new librados::C_AioSafe(c)); + } + c->put_unlock(); + } +}; + +int librados::RadosClient::async_watch_flush(AioCompletionImpl *c) +{ + ldout(cct, 10) << __func__ << " enter" << dendl; + Context *oncomplete = new C_aio_watch_flush_Complete(this, c); + objecter->linger_callback_flush(oncomplete); ldout(cct, 10) << __func__ << " exit" << dendl; return 0; } diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index e190bfc90117..217c7823b29b 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -32,6 +32,7 @@ struct md_config_t; class Message; class MLog; class Messenger; +class AioCompletionImpl; class librados::RadosClient : public Dispatcher { @@ -82,6 +83,7 @@ public: void shutdown(); int watch_flush(); + int async_watch_flush(AioCompletionImpl *c); uint64_t get_instance_id();