]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
journal: async methods to (un)register and update client
authorMykola Golub <mgolub@mirantis.com>
Thu, 25 Feb 2016 08:27:29 +0000 (10:27 +0200)
committerMykola Golub <mgolub@mirantis.com>
Sat, 27 Feb 2016 10:33:13 +0000 (12:33 +0200)
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
src/journal/JournalMetadata.cc
src/journal/JournalMetadata.h
src/journal/Journaler.cc
src/journal/Journaler.h

index 3d70518e8d03cea7654ca1b6126cab8e2c08bd08..ca35fc2923d75e747d03f01ef239afb9695b0fcd 100644 (file)
@@ -357,32 +357,53 @@ void JournalMetadata::get_mutable_metadata(uint64_t *minimum_set,
                               on_finish);
 }
 
-int JournalMetadata::register_client(const bufferlist &data) {
+void JournalMetadata::register_client(const bufferlist &data,
+                                     Context *on_finish) {
   ldout(m_cct, 10) << __func__ << ": " << m_client_id << dendl;
-  int r = client::client_register(m_ioctx, m_oid, m_client_id, data);
-  if (r < 0) {
-    lderr(m_cct) << "failed to register journal client '" << m_client_id
-                 << "': " << cpp_strerror(r) << dendl;
-    return r;
-  }
+  librados::ObjectWriteOperation op;
+  client::client_register(&op, m_client_id, data);
+
+  C_NotifyUpdate *ctx = new C_NotifyUpdate(this, on_finish);
+
+  librados::AioCompletion *comp =
+    librados::Rados::aio_create_completion(ctx, NULL,
+                                           utils::rados_ctx_callback);
+  int r = m_ioctx.aio_operate(m_oid, comp, &op);
+  assert(r == 0);
+  comp->release();
+}
+
+void JournalMetadata::update_client(const bufferlist &data,
+                                   Context *on_finish) {
+  ldout(m_cct, 10) << __func__ << ": " << m_client_id << dendl;
+  librados::ObjectWriteOperation op;
+  client::client_update(&op, m_client_id, data);
+
+  C_NotifyUpdate *ctx = new C_NotifyUpdate(this, on_finish);
 
-  notify_update();
-  return 0;
+  librados::AioCompletion *comp =
+    librados::Rados::aio_create_completion(ctx, NULL,
+                                           utils::rados_ctx_callback);
+  int r = m_ioctx.aio_operate(m_oid, comp, &op);
+  assert(r == 0);
+  comp->release();
 }
 
-int JournalMetadata::unregister_client() {
+void JournalMetadata::unregister_client(Context *on_finish) {
   assert(!m_client_id.empty());
 
   ldout(m_cct, 10) << __func__ << ": " << m_client_id << dendl;
-  int r = client::client_unregister(m_ioctx, m_oid, m_client_id);
-  if (r < 0) {
-    lderr(m_cct) << "failed to unregister journal client '" << m_client_id
-                 << "': " << cpp_strerror(r) << dendl;
-    return r;
-  }
+  librados::ObjectWriteOperation op;
+  client::client_unregister(&op, m_client_id);
+
+  C_NotifyUpdate *ctx = new C_NotifyUpdate(this, on_finish);
 
-  notify_update();
-  return 0;
+  librados::AioCompletion *comp =
+    librados::Rados::aio_create_completion(ctx, NULL,
+                                           utils::rados_ctx_callback);
+  int r = m_ioctx.aio_operate(m_oid, comp, &op);
+  assert(r == 0);
+  comp->release();
 }
 
 void JournalMetadata::allocate_tag(uint64_t tag_class, const bufferlist &data,
index 02d4a9ba4799d31ec6e2dd9a628a6b428fc0a96d..f233edf81dbf2462a98815844dff990b1390e9c3 100644 (file)
@@ -60,8 +60,9 @@ public:
   void add_listener(Listener *listener);
   void remove_listener(Listener *listener);
 
-  int register_client(const bufferlist &data);
-  int unregister_client();
+  void register_client(const bufferlist &data, Context *on_finish);
+  void update_client(const bufferlist &data, Context *on_finish);
+  void unregister_client(Context *on_finish);
 
   void allocate_tag(uint64_t tag_class, const bufferlist &data,
                     Tag *tag, Context *on_finish);
index 5db705ece9055c5ba3545e74c2917d2dfb662881..a6220ef1012afbd91d4115492c2c7982e3de6476 100644 (file)
@@ -176,11 +176,27 @@ void Journaler::flush_commit_position(Context *on_safe) {
 }
 
 int Journaler::register_client(const bufferlist &data) {
-  return m_metadata->register_client(data);
+  C_SaferCond cond;
+  register_client(data, &cond);
+  return cond.wait();
 }
 
 int Journaler::unregister_client() {
-  return m_metadata->unregister_client();
+  C_SaferCond cond;
+  unregister_client(&cond);
+  return cond.wait();
+}
+
+void Journaler::register_client(const bufferlist &data, Context *on_finish) {
+  return m_metadata->register_client(data, on_finish);
+}
+
+void Journaler::update_client(const bufferlist &data, Context *on_finish) {
+  return m_metadata->update_client(data, on_finish);
+}
+
+void Journaler::unregister_client(Context *on_finish) {
+  return m_metadata->unregister_client(on_finish);
 }
 
 void Journaler::allocate_tag(const bufferlist &data, cls::journal::Tag *tag,
index a07ecccf8e42fd179f26d5c4f65c1ea34dfdcb06..2e9ba85bb20836c2d65b19584acc97df3434ea58 100644 (file)
@@ -53,6 +53,9 @@ public:
 
   int register_client(const bufferlist &data);
   int unregister_client();
+  void register_client(const bufferlist &data, Context *on_finish);
+  void update_client(const bufferlist &data, Context *on_finish);
+  void unregister_client(Context *on_finish);
 
   void flush_commit_position(Context *on_safe);