]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Journaler: avoid executing on_safe contexts prematurely 15468/head
authorYan, Zheng <zyan@redhat.com>
Tue, 23 May 2017 13:46:54 +0000 (21:46 +0800)
committerNathan Cutler <ncutler@suse.com>
Wed, 14 Jun 2017 14:40:33 +0000 (16:40 +0200)
Journaler::_do_flush() can skip flushing some data when prezered
journal space isn't enough. Before updating Journaler::next_safe_pos,
we need to check if Journaler::_do_flush() has flushed enough data.

Fixes: http://tracker.ceph.com/issues/20055
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 6511e7a9e35a14216c03cd6921ca4d232274f953)

src/osdc/Journaler.cc

index 88208dcec0082b545e37cc1a66e7df6c21e304a4..b2f179ad74e9464a0240ce6174bdd2bd564c1877 100644 (file)
@@ -594,8 +594,11 @@ uint64_t Journaler::append_entry(bufferlist& bl)
     ldout(cct, 10) << " flushing completed object(s) (su " << su << " wro "
                   << write_obj << " flo " << flush_obj << ")" << dendl;
     _do_flush(write_buf.length() - write_off);
-    if (write_off) {
-      // current entry isn't being flushed, set next_safe_pos to the end of previous entry
+
+    // if _do_flush() skips flushing some data, it does not update next_safe_pos.
+    if (write_buf.length() > 0 &&
+       write_buf.length() <= wrote) { // the unflushed data are within this entry
+      // set next_safe_pos to end of previous entry
       next_safe_pos = write_pos - wrote;
     }
   }