From 6d16821712ba699749882921777d27396c93a39f Mon Sep 17 00:00:00 2001 From: Zhi Zhang Date: Thu, 20 Sep 2018 10:55:46 +0800 Subject: [PATCH] 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 --- src/osdc/Journaler.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc index 63cf435e4c056..939fbba2891c6 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 -- 2.39.5