From 1c76ef4e3ea7cb401345af0938d6b76652061d05 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Sat, 1 Oct 2016 11:21:21 +0300 Subject: [PATCH] journal: ensure in-flight ops are complete destroying journaler Fixes: http://tracker.ceph.com/issues/17446 Signed-off-by: Jason Dillaman (cherry picked from commit a25b1d7cbebb7b19cebee4cfb362cd744bbb4607) --- src/journal/JournalMetadata.cc | 6 ++++++ src/journal/JournalMetadata.h | 2 ++ src/journal/Journaler.cc | 6 ++++++ src/journal/Journaler.h | 1 + 4 files changed, 15 insertions(+) diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc index db10487000998..7b09586f5a825 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 c50c481dcce95..24c3a69361fa0 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 0c3e796e01fd6..0b21ebf01a73d 100644 --- a/src/journal/Journaler.cc +++ b/src/journal/Journaler.cc @@ -103,6 +103,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; } @@ -124,6 +129,7 @@ int Journaler::exists(bool *header_exists) 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 bac8f4d24c5ff..9a1e75b8b9bd3 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; -- 2.39.5