m_ioctx.notify2(m_oid, bl, 5000, NULL);
}
-void JournalMetadata::async_notify_update() {
+void JournalMetadata::async_notify_update(Context *on_safe) {
ldout(m_cct, 10) << "async notifying journal header update" << dendl;
- C_AioNotify *ctx = new C_AioNotify(this);
+ C_AioNotify *ctx = new C_AioNotify(this, on_safe);
librados::AioCompletion *comp =
librados::Rados::aio_create_completion(ctx, NULL,
utils::rados_ctx_callback);
void committed(uint64_t commit_tid, const CreateContext &create_context);
void notify_update();
- void async_notify_update();
+ void async_notify_update(Context *on_safe);
private:
typedef std::map<uint64_t, uint64_t> AllocatedEntryTids;
struct C_AioNotify : public Context {
JournalMetadata* journal_metadata;
+ Context *on_safe;
- C_AioNotify(JournalMetadata *_journal_metadata)
- : journal_metadata(_journal_metadata) {
+ C_AioNotify(JournalMetadata *_journal_metadata, Context *_on_safe)
+ : journal_metadata(_journal_metadata), on_safe(_on_safe) {
journal_metadata->m_async_op_tracker.start_op();
}
virtual ~C_AioNotify() {
}
virtual void finish(int r) {
journal_metadata->handle_notified(r);
+ if (on_safe != nullptr) {
+ on_safe->complete(0);
+ }
}
};
}
virtual void finish(int r) {
if (r == 0) {
- journal_metadata->async_notify_update();
+ journal_metadata->async_notify_update(on_safe);
+ return;
}
if (on_safe != NULL) {
on_safe->complete(r);