comp->release();
}
+void JournalMetadata::wait_for_ops() {
+ C_SaferCond ctx;
+ m_async_op_tracker.wait_for_ops(&ctx);
+ ctx.wait();
+}
+
void JournalMetadata::handle_notified(int r) {
ldout(m_cct, 10) << "notified journal header update: r=" << r << dendl;
}
void notify_update();
void async_notify_update(Context *on_safe);
+ void wait_for_ops();
+
private:
typedef std::map<uint64_t, uint64_t> AllocatedEntryTids;
typedef std::list<JournalMetadataListener*> Listeners;
Journaler::~Journaler() {
if (m_metadata != nullptr) {
assert(!m_metadata->is_initialized());
+ if (!m_initialized) {
+ // never initialized -- ensure any in-flight ops are complete
+ // since we wouldn't expect shut_down to be invoked
+ m_metadata->wait_for_ops();
+ }
m_metadata->put();
m_metadata = nullptr;
}
}
void Journaler::init(Context *on_init) {
+ m_initialized = true;
m_metadata->init(new C_InitJournaler(this, on_init));
}
std::string m_header_oid;
std::string m_object_oid_prefix;
+ bool m_initialized = false;
JournalMetadata *m_metadata = nullptr;
JournalPlayer *m_player = nullptr;
JournalRecorder *m_recorder = nullptr;