From: Zhi Zhang Date: Thu, 20 Sep 2018 02:55:46 +0000 (+0800) Subject: mds: fix mds damaged due to unexpected journal length X-Git-Tag: v13.2.3~110^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F24463%2Fhead;p=ceph.git mds: fix mds damaged due to unexpected journal length We used first next_safe_pos in pending_safe to update journal's safe_pos, but it might not be flushed at this time, so journal's header may get incorrect write_pos in some case, which could cause mds damaged. This fix is trying to use current min next_safe_pos in pending_safe to update journal's safe_pos. Signed-off-by: Zhi Zhang (cherry picked from commit d17790f299c282dff9c28569b10c46a54b4cfd51) Conflicts: src/osdc/Journaler.cc : Resolved in _finish_flush --- diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc index 63cf435e4c05..939fbba2891c 100644 --- a/src/osdc/Journaler.cc +++ b/src/osdc/Journaler.cc @@ -530,11 +530,12 @@ void Journaler::_finish_flush(int r, uint64_t start, ceph::real_time stamp) // adjust safe_pos auto it = pending_safe.find(start); assert(it != pending_safe.end()); + uint64_t min_next_safe_pos = pending_safe.begin()->second; pending_safe.erase(it); if (pending_safe.empty()) safe_pos = next_safe_pos; else - safe_pos = pending_safe.begin()->second; + safe_pos = min_next_safe_pos; ldout(cct, 10) << "_finish_flush safe from " << start << ", pending_safe " << pending_safe