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,
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);
}
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,