From bdee02cb57d4245cb55ed549cb1aa10ddf2bc709 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Sun, 27 Mar 2016 20:30:44 -0400 Subject: [PATCH] journal: helper method for retrieving tag struct Signed-off-by: Jason Dillaman --- src/journal/JournalMetadata.cc | 58 ++++++++++++++++++++++++++++++++++ src/journal/JournalMetadata.h | 1 + src/journal/Journaler.cc | 4 +++ src/journal/Journaler.h | 2 ++ 4 files changed, 65 insertions(+) diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc index 2f3ef370de09a..ba85f4b3959ea 100644 --- a/src/journal/JournalMetadata.cc +++ b/src/journal/JournalMetadata.cc @@ -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 &tag_class, Tags *tags, Context *on_finish) { C_GetTags *ctx = new C_GetTags(m_cct, m_ioctx, m_oid, m_client_id, diff --git a/src/journal/JournalMetadata.h b/src/journal/JournalMetadata.h index 67261a061df5a..d95f1ed7072b3 100644 --- a/src/journal/JournalMetadata.h +++ b/src/journal/JournalMetadata.h @@ -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 &tag_class, Tags *tags, Context *on_finish); diff --git a/src/journal/Journaler.cc b/src/journal/Journaler.cc index 28d16c128b358..0981db8e18da6 100644 --- a/src/journal/Journaler.cc +++ b/src/journal/Journaler.cc @@ -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); } diff --git a/src/journal/Journaler.h b/src/journal/Journaler.h index bedba497113dd..055b8bf353c4f 100644 --- a/src/journal/Journaler.h +++ b/src/journal/Journaler.h @@ -41,6 +41,7 @@ public: Mutex timer_lock; }; + typedef cls::journal::Tag Tag; typedef std::list Tags; typedef std::set 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); -- 2.39.5