]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
RadosClient: add async watch_flush version
authorHaomai Wang <haomai@xsky.com>
Fri, 19 Feb 2016 03:26:45 +0000 (11:26 +0800)
committerHaomai Wang <haomai@xsky.com>
Sat, 20 Feb 2016 06:37:22 +0000 (14:37 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/librados/RadosClient.cc
src/librados/RadosClient.h

index 1df66695c8115a41164168b70cae4e9513ef703a..7b089907bbe7888d4a6c77f7337093a32c29a16d 100644 (file)
@@ -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;
 }
index e190bfc90117030c12b5466baad5af8037b060ab..217c7823b29b00bcef923e81a1a4d2c2d2ffa4fe 100644 (file)
@@ -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();