From: Jason Dillaman Date: Tue, 24 May 2016 19:53:12 +0000 (-0400) Subject: journal: trimmer now has asynchronous shutdown X-Git-Tag: v11.0.0~399^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=59ca9916ba2e2b144eff5ee471a314b9c4391936;p=ceph.git journal: trimmer now has asynchronous shutdown Signed-off-by: Jason Dillaman --- diff --git a/src/journal/JournalTrimmer.cc b/src/journal/JournalTrimmer.cc index 74df78abc4fb..a4a47fab76c5 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 8c577767d1f6..26bfca7ec32b 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 d7da30f226fe..82f844e4a9b2 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 296a9da8cc3b..2849019a4f9b 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();