From 3916c835cd9be4c1453471e836d48cdbd4e43fe9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 2 Nov 2014 14:27:12 -0800 Subject: [PATCH] JounralingObjectStore: journal->committed_thru after replay It's possible that the osd stopped between when the filestore op_seq file was updated and when the journal was trimmed. In that case, it's possible that on boot the journal might be full, and yet not be trimmed because commit_start assumes there is no work to do. Calling committed_thru on the journal ensures that the journal matches committed_seq. Backport: giant firefly emperor dumpling Fixes: #6756 Signed-off-by: Samuel Just Reviewed-by: Josh Durgin Reviewed-by: David Zafman (cherry picked from commit 8924158df8580bbb462130b5bb7f753b13513a23) --- src/os/FileJournal.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/os/FileJournal.cc b/src/os/FileJournal.cc index 2c9e73265c9..dc3a46a9199 100644 --- a/src/os/FileJournal.cc +++ b/src/os/FileJournal.cc @@ -469,7 +469,6 @@ int FileJournal::open(uint64_t fs_op_seq) { dout(2) << "open " << fn << " fsid " << fsid << " fs_op_seq " << fs_op_seq << dendl; - last_committed_seq = fs_op_seq; uint64_t next_seq = fs_op_seq + 1; int err = _open(false); @@ -528,6 +527,16 @@ int FileJournal::open(uint64_t fs_op_seq) // find next entry read_pos = header.start; uint64_t seq = header.start_seq; + + // last_committed_seq is 1 before the start of the journal or + // 0 if the start is 0 + last_committed_seq = seq > 0 ? seq - 1 : seq; + if (last_committed_seq < fs_op_seq) { + dout(2) << "open advancing committed_seq " << last_committed_seq + << " to fs op_seq " << fs_op_seq << dendl; + last_committed_seq = fs_op_seq; + } + while (1) { bufferlist bl; off64_t old_pos = read_pos; -- 2.47.3