From: Mykola Golub Date: Thu, 25 Feb 2016 08:27:29 +0000 (+0200) Subject: journal: async methods to (un)register and update client X-Git-Tag: v10.1.0~279^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a4527c3cf59d66fbcc3adc7f62989a9601cb2ad0;p=ceph.git journal: async methods to (un)register and update client Signed-off-by: Mykola Golub --- diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc index 3d70518e8d0..ca35fc2923d 100644 --- a/src/journal/JournalMetadata.cc +++ b/src/journal/JournalMetadata.cc @@ -357,32 +357,53 @@ void JournalMetadata::get_mutable_metadata(uint64_t *minimum_set, on_finish); } -int JournalMetadata::register_client(const bufferlist &data) { +void JournalMetadata::register_client(const bufferlist &data, + Context *on_finish) { ldout(m_cct, 10) << __func__ << ": " << m_client_id << dendl; - int r = client::client_register(m_ioctx, m_oid, m_client_id, data); - if (r < 0) { - lderr(m_cct) << "failed to register journal client '" << m_client_id - << "': " << cpp_strerror(r) << dendl; - return r; - } + librados::ObjectWriteOperation op; + client::client_register(&op, m_client_id, data); + + C_NotifyUpdate *ctx = new C_NotifyUpdate(this, on_finish); + + librados::AioCompletion *comp = + librados::Rados::aio_create_completion(ctx, NULL, + utils::rados_ctx_callback); + int r = m_ioctx.aio_operate(m_oid, comp, &op); + assert(r == 0); + comp->release(); +} + +void JournalMetadata::update_client(const bufferlist &data, + Context *on_finish) { + ldout(m_cct, 10) << __func__ << ": " << m_client_id << dendl; + librados::ObjectWriteOperation op; + client::client_update(&op, m_client_id, data); + + C_NotifyUpdate *ctx = new C_NotifyUpdate(this, on_finish); - notify_update(); - return 0; + librados::AioCompletion *comp = + librados::Rados::aio_create_completion(ctx, NULL, + utils::rados_ctx_callback); + int r = m_ioctx.aio_operate(m_oid, comp, &op); + assert(r == 0); + comp->release(); } -int JournalMetadata::unregister_client() { +void JournalMetadata::unregister_client(Context *on_finish) { assert(!m_client_id.empty()); ldout(m_cct, 10) << __func__ << ": " << m_client_id << dendl; - int r = client::client_unregister(m_ioctx, m_oid, m_client_id); - if (r < 0) { - lderr(m_cct) << "failed to unregister journal client '" << m_client_id - << "': " << cpp_strerror(r) << dendl; - return r; - } + librados::ObjectWriteOperation op; + client::client_unregister(&op, m_client_id); + + C_NotifyUpdate *ctx = new C_NotifyUpdate(this, on_finish); - notify_update(); - return 0; + librados::AioCompletion *comp = + librados::Rados::aio_create_completion(ctx, NULL, + utils::rados_ctx_callback); + int r = m_ioctx.aio_operate(m_oid, comp, &op); + assert(r == 0); + comp->release(); } void JournalMetadata::allocate_tag(uint64_t tag_class, const bufferlist &data, diff --git a/src/journal/JournalMetadata.h b/src/journal/JournalMetadata.h index 02d4a9ba479..f233edf81db 100644 --- a/src/journal/JournalMetadata.h +++ b/src/journal/JournalMetadata.h @@ -60,8 +60,9 @@ public: void add_listener(Listener *listener); void remove_listener(Listener *listener); - int register_client(const bufferlist &data); - int unregister_client(); + 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 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 5db705ece90..a6220ef1012 100644 --- a/src/journal/Journaler.cc +++ b/src/journal/Journaler.cc @@ -176,11 +176,27 @@ void Journaler::flush_commit_position(Context *on_safe) { } int Journaler::register_client(const bufferlist &data) { - return m_metadata->register_client(data); + C_SaferCond cond; + register_client(data, &cond); + return cond.wait(); } int Journaler::unregister_client() { - return m_metadata->unregister_client(); + C_SaferCond cond; + unregister_client(&cond); + return cond.wait(); +} + +void Journaler::register_client(const bufferlist &data, Context *on_finish) { + return m_metadata->register_client(data, on_finish); +} + +void Journaler::update_client(const bufferlist &data, Context *on_finish) { + return m_metadata->update_client(data, on_finish); +} + +void Journaler::unregister_client(Context *on_finish) { + return m_metadata->unregister_client(on_finish); } void Journaler::allocate_tag(const bufferlist &data, cls::journal::Tag *tag, diff --git a/src/journal/Journaler.h b/src/journal/Journaler.h index a07ecccf8e4..2e9ba85bb20 100644 --- a/src/journal/Journaler.h +++ b/src/journal/Journaler.h @@ -53,6 +53,9 @@ public: int register_client(const bufferlist &data); int unregister_client(); + 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 flush_commit_position(Context *on_safe);