From: Jason Dillaman Date: Tue, 22 Mar 2016 20:28:59 +0000 (-0400) Subject: journal: added helper to query single client record from disk X-Git-Tag: v10.1.1~64^2~27 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0b0b2244a0a44f5a77d57bbefec987b1cd8a5539;p=ceph.git journal: added helper to query single client record from disk Signed-off-by: Jason Dillaman --- diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc index 830b4caaa7d0..2f3ef370de09 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 8bedb98056e5..67261a061df5 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 957243be0a9a..28d16c128b35 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 c0bb137b0ab6..bedba497113d 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);