]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: flush journal entries prior to releasing lock
authorJason Dillaman <dillaman@redhat.com>
Tue, 1 Sep 2015 14:17:02 +0000 (10:17 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 13 Nov 2015 04:27:57 +0000 (23:27 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/Journal.cc
src/librbd/Journal.h

index ca4221e11a756ae3070c0702833fbc984705a4ab..37e311e46e2804d9c676694f60d4a3819e9b18c8 100644 (file)
@@ -545,6 +545,9 @@ void Journal::handle_lock_updated(ImageWatcher::LockUpdateState state) {
       // prevent new write ops but allow pending ops to flush to the journal
       block_writes();
     }
+    if (m_state == STATE_RECORDING) {
+      flush_journal();
+    }
   } else if ((state == ImageWatcher::LOCK_UPDATE_STATE_NOT_SUPPORTED ||
               state == ImageWatcher::LOCK_UPDATE_STATE_UNLOCKED) &&
              m_state != STATE_UNINITIALIZED &&
@@ -600,6 +603,19 @@ void Journal::unblock_writes() {
   }
 }
 
+void Journal::flush_journal() {
+  assert(m_lock.is_locked());
+
+  CephContext *cct = m_image_ctx.cct;
+  ldout(cct, 20) << this << " " << __func__ << dendl;
+
+  m_lock.Unlock();
+  C_SaferCond cond_ctx;
+  m_journaler->flush(&cond_ctx);
+  cond_ctx.wait();
+  m_lock.Lock();
+}
+
 void Journal::transition_state(State state) {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 20) << this << " " << __func__ << ": new state=" << state << dendl;
index 392960507c942b343bb170a48f4ae683d60414b9..f6368b27f136bca31ae0711e205b94e9276ea605 100644 (file)
@@ -199,6 +199,7 @@ private:
   void block_writes();
   void unblock_writes();
 
+  void flush_journal();
   void transition_state(State state);
   void wait_for_state_transition();
 };