]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
JounralingObjectStore: journal->committed_thru after replay
authorSamuel Just <sam.just@inktank.com>
Tue, 12 Nov 2013 21:39:04 +0000 (13:39 -0800)
committerSamuel Just <sam.just@inktank.com>
Thu, 14 Nov 2013 20:24:22 +0000 (12:24 -0800)
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: emperor dumpling
Fixes: 6756
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Reviewed-by: David Zafman <david.zafman@inktank.com>
src/os/FileJournal.cc
src/os/JournalingObjectStore.cc

index 4a2af08dd4c0a2b03a9b42161ae08738808cc41b..287f4b676717429a2310235d93594fb6ed6797c1 100644 (file)
@@ -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,11 @@ 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;
+
   while (1) {
     bufferlist bl;
     off64_t old_pos = read_pos;
index e662580ac42bf3270a6c19d1cd50fab6bcbadade..4147ced8a3ab496e26666450d15712391d2cb183 100644 (file)
@@ -100,6 +100,8 @@ int JournalingObjectStore::journal_replay(uint64_t fs_op_seq)
   // done reading, make writeable.
   journal->make_writeable();
 
+  journal->committed_thru(fs_op_seq);
+
   return count;
 }