From d17790f299c282dff9c28569b10c46a54b4cfd51 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 --- 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 b2c75795c3e30..a464d0fd75b5c 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); ceph_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