From 0b0b2244a0a44f5a77d57bbefec987b1cd8a5539 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 22 Mar 2016 16:28:59 -0400 Subject: [PATCH] journal: added helper to query single client record from disk Signed-off-by: Jason Dillaman --- src/journal/JournalMetadata.cc | 64 ++++++++++++++++++++++++++++++++++ src/journal/JournalMetadata.h | 2 ++ src/journal/Journaler.cc | 6 ++++ src/journal/Journaler.h | 3 +- 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc index 830b4caaa7d..2f3ef370de0 100644 --- a/src/journal/JournalMetadata.cc +++ b/src/journal/JournalMetadata.cc @@ -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 &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 8bedb98056e..67261a061df 100644 --- a/src/journal/JournalMetadata.h +++ b/src/journal/JournalMetadata.h @@ -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); diff --git a/src/journal/Journaler.cc b/src/journal/Journaler.cc index 957243be0a9..28d16c128b3 100644 --- a/src/journal/Journaler.cc +++ b/src/journal/Journaler.cc @@ -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; diff --git a/src/journal/Journaler.h b/src/journal/Journaler.h index c0bb137b0ab..bedba497113 100644 --- a/src/journal/Journaler.h +++ b/src/journal/Journaler.h @@ -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); -- 2.47.3