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)
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;
}
}