]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: helper method for retrieving tag struct
authorJason Dillaman <dillaman@redhat.com>
Mon, 28 Mar 2016 00:30:44 +0000 (20:30 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 29 Mar 2016 19:19:25 +0000 (15:19 -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 2f3ef370de09a15d7fea44614cd68abf962f817e..ba85f4b3959eaeb42852ece65099b1bf3174d2fc 100644 (file)
@@ -198,6 +198,58 @@ struct C_AllocateTag : public Context {
   }
 };
 
+struct C_GetTag : public Context {
+  CephContext *cct;
+  librados::IoCtx &ioctx;
+  const std::string &oid;
+  AsyncOpTracker &async_op_tracker;
+  uint64_t tag_tid;
+  JournalMetadata::Tag *tag;
+  Context *on_finish;
+
+  bufferlist out_bl;
+
+  C_GetTag(CephContext *cct, librados::IoCtx &ioctx, const std::string &oid,
+           AsyncOpTracker &async_op_tracker, uint64_t tag_tid,
+           JournalMetadata::Tag *tag, Context *on_finish)
+    : cct(cct), ioctx(ioctx), oid(oid), async_op_tracker(async_op_tracker),
+      tag_tid(tag_tid), tag(tag), on_finish(on_finish) {
+    async_op_tracker.start_op();
+  }
+  virtual ~C_GetTag() {
+    async_op_tracker.finish_op();
+  }
+
+  void send() {
+    send_get_tag();
+  }
+
+  void send_get_tag() {
+    librados::ObjectReadOperation op;
+    client::get_tag_start(&op, tag_tid);
+
+    librados::AioCompletion *comp = librados::Rados::aio_create_completion(
+      this, nullptr, &utils::rados_state_callback<
+        C_GetTag, &C_GetTag::handle_get_tag>);
+
+    int r = ioctx.aio_operate(oid, comp, &op, &out_bl);
+    assert(r == 0);
+    comp->release();
+  }
+
+  void handle_get_tag(int r) {
+    if (r == 0) {
+      bufferlist::iterator iter = out_bl.begin();
+      r = client::get_tag_finish(&iter, tag);
+    }
+    complete(r);
+  }
+
+  virtual void finish(int r) override {
+    on_finish->complete(r);
+  }
+};
+
 struct C_GetTags : public Context {
   CephContext *cct;
   librados::IoCtx &ioctx;
@@ -429,6 +481,12 @@ void JournalMetadata::get_client(const std::string &client_id,
   ctx->send();
 }
 
+void JournalMetadata::get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish) {
+  C_GetTag *ctx = new C_GetTag(m_cct, m_ioctx, m_oid, m_async_op_tracker,
+                               tag_tid, tag, 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 67261a061df5aa47c836f36381de86570947dcf5..d95f1ed7072b36633164aef01a4ffa5874132cb6 100644 (file)
@@ -73,6 +73,7 @@ public:
 
   void allocate_tag(uint64_t tag_class, const bufferlist &data,
                     Tag *tag, Context *on_finish);
+  void get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish);
   void get_tags(const boost::optional<uint64_t> &tag_class, Tags *tags,
                 Context *on_finish);
 
index 28d16c128b35828502a3efe41f8f0060b38569c2..0981db8e18da664f560314be1537d16d268d5387 100644 (file)
@@ -279,6 +279,10 @@ void Journaler::allocate_tag(uint64_t tag_class, const bufferlist &data,
   m_metadata->allocate_tag(tag_class, data, tag, on_finish);
 }
 
+void Journaler::get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish) {
+  m_metadata->get_tag(tag_tid, tag, on_finish);
+}
+
 void Journaler::get_tags(uint64_t tag_class, Tags *tags, Context *on_finish) {
   m_metadata->get_tags(tag_class, tags, on_finish);
 }
index bedba497113dd79cfc39f3695907b1284242468f..055b8bf353c4f16761116cc09612a313759c8d5c 100644 (file)
@@ -41,6 +41,7 @@ public:
     Mutex timer_lock;
   };
 
+  typedef cls::journal::Tag Tag;
   typedef std::list<cls::journal::Tag> Tags;
   typedef std::set<cls::journal::Client> RegisteredClients;
 
@@ -87,6 +88,7 @@ public:
                     Context *on_finish);
   void allocate_tag(uint64_t tag_class, const bufferlist &data,
                     cls::journal::Tag *tag, Context *on_finish);
+  void get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish);
   void get_tags(uint64_t tag_class, Tags *tags, Context *on_finish);
 
   void start_replay(ReplayHandler *replay_handler);