]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: ensure in-flight ops are complete destroying journaler 11433/head
authorMykola Golub <mgolub@mirantis.com>
Sat, 1 Oct 2016 08:21:21 +0000 (11:21 +0300)
committerJason Dillaman <dillaman@redhat.com>
Tue, 11 Oct 2016 18:16:46 +0000 (14:16 -0400)
Fixes: http://tracker.ceph.com/issues/17446
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit a25b1d7cbebb7b19cebee4cfb362cd744bbb4607)

src/journal/JournalMetadata.cc
src/journal/JournalMetadata.h
src/journal/Journaler.cc
src/journal/Journaler.h

index db10487000998e2ea969bc633ea47774c7bc3097..7b09586f5a825127496d28a03ee9ccfa085620ff 100644 (file)
@@ -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;
 }
index c50c481dcce9553b67822c95a73ca599f8dc92b0..24c3a69361fa02df86c67d3909f5a2dccdc99a7c 100644 (file)
@@ -153,6 +153,8 @@ public:
   void notify_update();
   void async_notify_update(Context *on_safe);
 
+  void wait_for_ops();
+
 private:
   typedef std::map<uint64_t, uint64_t> AllocatedEntryTids;
   typedef std::list<JournalMetadataListener*> Listeners;
index 0c3e796e01fd610fea2b203c203db6ec617bd8ef..0b21ebf01a73d925de66c43b334a1d1826bd4c63 100644 (file)
@@ -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));
 }
 
index bac8f4d24c5ffad3c2a35b63415fa3eb27d671ce..9a1e75b8b9bd360cdff7d40725e046185f5f58f0 100644 (file)
@@ -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;