From: Yan, Zheng Date: Tue, 23 May 2017 13:46:54 +0000 (+0800) Subject: osdc/Journaler: avoid executing on_safe contexts prematurely X-Git-Tag: ses5-milestone6~9^2~33^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6511e7a9e35a14216c03cd6921ca4d232274f953;p=ceph.git osdc/Journaler: avoid executing on_safe contexts prematurely 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" --- diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc index 5949ff3b4016..bfecac212c3b 100644 --- a/src/osdc/Journaler.cc +++ b/src/osdc/Journaler.cc @@ -568,8 +568,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; } }