]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
journal: added helper to query single client record from disk
authorJason Dillaman <dillaman@redhat.com>
Tue, 22 Mar 2016 20:28:59 +0000 (16:28 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 29 Mar 2016 19:12:29 +0000 (15:12 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/journal/JournalMetadata.cc
src/journal/JournalMetadata.h
src/journal/Journaler.cc
src/journal/Journaler.h

index 830b4caaa7d0c090f1983350153b71f3a684444f..2f3ef370de09a15d7fea44614cd68abf962f817e 100644 (file)
@@ -19,6 +19,62 @@ using namespace cls::journal;
 
 namespace {
 
+struct C_GetClient : public Context {
+  CephContext *cct;
+  librados::IoCtx &ioctx;
+  const std::string &oid;
+  AsyncOpTracker &async_op_tracker;
+  std::string client_id;
+  cls::journal::Client *client;
+  Context *on_finish;
+
+  bufferlist out_bl;
+
+  C_GetClient(CephContext *cct, librados::IoCtx &ioctx, const std::string &oid,
+              AsyncOpTracker &async_op_tracker, const std::string &client_id,
+              cls::journal::Client *client, Context *on_finish)
+    : cct(cct), ioctx(ioctx), oid(oid), async_op_tracker(async_op_tracker),
+      client_id(client_id), client(client), on_finish(on_finish) {
+    async_op_tracker.start_op();
+  }
+  virtual ~C_GetClient() {
+    async_op_tracker.finish_op();
+  }
+
+  virtual void send() {
+    send_get_client();
+  }
+
+  void send_get_client() {
+    ldout(cct, 20) << "C_GetClient: " << __func__ << dendl;
+
+    librados::ObjectReadOperation op;
+    client::get_client_start(&op, client_id);
+
+    librados::AioCompletion *comp = librados::Rados::aio_create_completion(
+      this, nullptr, &utils::rados_state_callback<
+        C_GetClient, &C_GetClient::handle_get_client>);
+
+    int r = ioctx.aio_operate(oid, comp, &op, &out_bl);
+    assert(r == 0);
+    comp->release();
+  }
+
+  void handle_get_client(int r) {
+    ldout(cct, 20) << "C_GetClient: " << __func__ << ": r=" << r << dendl;
+
+    if (r == 0) {
+      bufferlist::iterator it = out_bl.begin();
+      r = client::get_client_finish(&it, client);
+    }
+    complete(r);
+  }
+
+  virtual void finish(int r) override {
+    on_finish->complete(r);
+  }
+};
+
 struct C_AllocateTag : public Context {
   CephContext *cct;
   librados::IoCtx &ioctx;
@@ -365,6 +421,14 @@ void JournalMetadata::allocate_tag(uint64_t tag_class, const bufferlist &data,
   ctx->send();
 }
 
+void JournalMetadata::get_client(const std::string &client_id,
+                                 cls::journal::Client *client,
+                                 Context *on_finish) {
+  C_GetClient *ctx = new C_GetClient(m_cct, m_ioctx, m_oid, m_async_op_tracker,
+                                     client_id, client, on_finish);
+  ctx->send();
+}
+
 void JournalMetadata::get_tags(const boost::optional<uint64_t> &tag_class,
                                Tags *tags, Context *on_finish) {
   C_GetTags *ctx = new C_GetTags(m_cct, m_ioctx, m_oid, m_client_id,
index 8bedb98056e5dbfd6402a4f9a1dd344ff583cd17..67261a061df5aa47c836f36381de86570947dcf5 100644 (file)
@@ -68,6 +68,8 @@ public:
   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 get_client(const std::string &client_id, cls::journal::Client *client,
+                  Context *on_finish);
 
   void allocate_tag(uint64_t tag_class, const bufferlist &data,
                     Tag *tag, Context *on_finish);
index 957243be0a9a3fef75fefdc608f5f3c15362c7e0..28d16c128b35828502a3efe41f8f0060b38569c2 100644 (file)
@@ -248,6 +248,12 @@ void Journaler::unregister_client(Context *on_finish) {
   return m_metadata->unregister_client(on_finish);
 }
 
+void Journaler::get_client(const std::string &client_id,
+                           cls::journal::Client *client,
+                           Context *on_finish) {
+  m_metadata->get_client(client_id, client, on_finish);
+}
+
 int Journaler::get_cached_client(const std::string &client_id,
                                  cls::journal::Client *client) {
   RegisteredClients clients;
index c0bb137b0ab62b7e427393846114059bbc0af995..bedba497113dd79cfc39f3695907b1284242468f 100644 (file)
@@ -76,7 +76,8 @@ public:
   void unregister_client(Context *on_finish);
 
   void update_client(const bufferlist &data, Context *on_finish);
-
+  void get_client(const std::string &client_id, cls::journal::Client *client,
+                  Context *on_finish);
   int get_cached_client(const std::string &client_id,
                         cls::journal::Client *client);