]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: trimmer now has asynchronous shutdown
authorJason Dillaman <dillaman@redhat.com>
Tue, 24 May 2016 19:53:12 +0000 (15:53 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 31 May 2016 15:49:37 +0000 (11:49 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 59ca9916ba2e2b144eff5ee471a314b9c4391936)

src/journal/JournalTrimmer.cc
src/journal/JournalTrimmer.h
src/journal/Journaler.cc
src/test/journal/test_JournalTrimmer.cc

index 74df78abc4fbc78df41d46517090da7f457081f7..a4a47fab76c5cbfbf99e98177ef97b55bc2ada7f 100644 (file)
@@ -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) {
index 8c577767d1f626d6a2b3283bc81ffc83ab2490c8..26bfca7ec32b111491263e12042291aa74613e30 100644 (file)
@@ -13,6 +13,8 @@
 #include "cls/journal/cls_journal_types.h"
 #include <functional>
 
+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);
     };
index d7da30f226fe81aff387eb4de08feebc2a2d39b5..82f844e4a9b2e1eac4cdcd85e51e3591a3588380 100644 (file)
@@ -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);
 
index 296a9da8cc3bf5750257ee0f18be35a721ebadcb..2849019a4f9b463cb87692c0b03d8dac80c8126b 100644 (file)
@@ -20,6 +20,9 @@ public:
 
     for (std::list<journal::JournalTrimmer*>::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();