From 59ca9916ba2e2b144eff5ee471a314b9c4391936 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 24 May 2016 15:53:12 -0400 Subject: [PATCH] journal: trimmer now has asynchronous shutdown Signed-off-by: Jason Dillaman --- src/journal/JournalTrimmer.cc | 18 ++++++++++++++++-- src/journal/JournalTrimmer.h | 6 ++++++ src/journal/Journaler.cc | 9 ++++++++- src/test/journal/test_JournalTrimmer.cc | 3 +++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/journal/JournalTrimmer.cc b/src/journal/JournalTrimmer.cc index 74df78abc4fbc..a4a47fab76c5c 100644 --- a/src/journal/JournalTrimmer.cc +++ b/src/journal/JournalTrimmer.cc @@ -27,10 +27,24 @@ JournalTrimmer::JournalTrimmer(librados::IoCtx &ioctx, } JournalTrimmer::~JournalTrimmer() { + assert(m_shutdown); +} + +void JournalTrimmer::shut_down(Context *on_finish) { + ldout(m_cct, 20) << __func__ << dendl; + { + Mutex::Locker locker(m_lock); + assert(!m_shutdown); + m_shutdown = true; + } + m_journal_metadata->remove_listener(&m_metadata_listener); - m_journal_metadata->flush_commit_position(); - m_async_op_tracker.wait_for_ops(); + // chain the shut down sequence (reverse order) + on_finish = new FunctionContext([this, on_finish](int r) { + m_async_op_tracker.wait_for_ops(on_finish); + }); + m_journal_metadata->flush_commit_position(on_finish); } int JournalTrimmer::remove_objects(bool force) { diff --git a/src/journal/JournalTrimmer.h b/src/journal/JournalTrimmer.h index 8c577767d1f62..26bfca7ec32b1 100644 --- a/src/journal/JournalTrimmer.h +++ b/src/journal/JournalTrimmer.h @@ -13,6 +13,8 @@ #include "cls/journal/cls_journal_types.h" #include +struct Context; + namespace journal { class JournalTrimmer { @@ -23,6 +25,8 @@ public: const JournalMetadataPtr &journal_metadata); ~JournalTrimmer(); + void shut_down(Context *on_finish); + int remove_objects(bool force); void committed(uint64_t commit_tid); @@ -85,6 +89,8 @@ private: uint64_t m_remove_set; Context *m_remove_set_ctx; + bool m_shutdown = false; + CreateContext m_create_commit_position_safe_context = [this]() { return new C_CommitPositionSafe(this); }; diff --git a/src/journal/Journaler.cc b/src/journal/Journaler.cc index d7da30f226fe8..82f844e4a9b2e 100644 --- a/src/journal/Journaler.cc +++ b/src/journal/Journaler.cc @@ -116,7 +116,14 @@ Journaler::~Journaler() { m_metadata->put(); m_metadata = nullptr; } - delete m_trimmer; + + // TODO + if (m_trimmer != nullptr) { + C_SaferCond ctx; + m_trimmer->shut_down(&ctx); + ctx.wait(); + delete m_trimmer; + } assert(m_player == nullptr); assert(m_recorder == nullptr); diff --git a/src/test/journal/test_JournalTrimmer.cc b/src/test/journal/test_JournalTrimmer.cc index 296a9da8cc3bf..2849019a4f9b4 100644 --- a/src/test/journal/test_JournalTrimmer.cc +++ b/src/test/journal/test_JournalTrimmer.cc @@ -20,6 +20,9 @@ public: for (std::list::iterator it = m_trimmers.begin(); it != m_trimmers.end(); ++it) { + C_SaferCond ctx; + (*it)->shut_down(&ctx); + ASSERT_EQ(0, ctx.wait()); delete *it; } RadosTestFixture::TearDown(); -- 2.39.5