From: Mykola Golub Date: Sat, 1 Oct 2016 08:21:21 +0000 (+0300) Subject: journal: ensure in-flight ops are complete destroying journaler X-Git-Tag: v11.0.1~34^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a25b1d7cbebb7b19cebee4cfb362cd744bbb4607;p=ceph.git journal: ensure in-flight ops are complete destroying journaler Fixes: http://tracker.ceph.com/issues/17446 Signed-off-by: Jason Dillaman --- diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc index db1048700099..7b09586f5a82 100644 --- a/src/journal/JournalMetadata.cc +++ b/src/journal/JournalMetadata.cc @@ -1029,6 +1029,12 @@ void JournalMetadata::async_notify_update(Context *on_safe) { 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; } diff --git a/src/journal/JournalMetadata.h b/src/journal/JournalMetadata.h index c50c481dcce9..24c3a69361fa 100644 --- a/src/journal/JournalMetadata.h +++ b/src/journal/JournalMetadata.h @@ -153,6 +153,8 @@ public: void notify_update(); void async_notify_update(Context *on_safe); + void wait_for_ops(); + private: typedef std::map AllocatedEntryTids; typedef std::list Listeners; diff --git a/src/journal/Journaler.cc b/src/journal/Journaler.cc index 108e428e541d..a138c7c08103 100644 --- a/src/journal/Journaler.cc +++ b/src/journal/Journaler.cc @@ -105,6 +105,11 @@ void Journaler::set_up(ContextWQ *work_queue, SafeTimer *timer, 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; } @@ -127,6 +132,7 @@ void Journaler::exists(Context *on_finish) const { } void Journaler::init(Context *on_init) { + m_initialized = true; m_metadata->init(new C_InitJournaler(this, on_init)); } diff --git a/src/journal/Journaler.h b/src/journal/Journaler.h index 1ba56c62b6cf..a14ea344d4ad 100644 --- a/src/journal/Journaler.h +++ b/src/journal/Journaler.h @@ -141,6 +141,7 @@ private: 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;