]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc: handle corruption in journal
authorJohn Spray <john.spray@redhat.com>
Wed, 20 May 2015 23:05:10 +0000 (00:05 +0100)
committerJohn Spray <john.spray@redhat.com>
Thu, 18 Jun 2015 10:19:44 +0000 (11:19 +0100)
Previously we just *detected* it in _is_readable
and raise a buffer::error.  Now actually catch that
exception and pass up to outer error handling.

Signed-off-by: John Spray <john.spray@redhat.com>
src/osdc/Journaler.cc

index 5b33eedd2a92e6882d9167e9a8bb094331854c68..148817578b082e4c014587283498a9849c56d3c3 100644 (file)
@@ -832,7 +832,21 @@ void Journaler::_finish_read(int r, uint64_t offset, bufferlist& bl)
   ldout(cct, 10) << "_finish_read got " << offset << "~" << bl.length() << dendl;
   prefetch_buf[offset].swap(bl);
 
-  _assimilate_prefetch();
+  try {
+    _assimilate_prefetch();
+    // Check the readable-ness of the buffer: do this head because it involves
+    // decoding, and we would like to catch any decode errors here so that
+    // external is_readable() callers don't have to.
+    _is_readable();
+  } catch (const buffer::error &err) {
+    error = -EINVAL;
+    if (on_readable) {
+      C_OnFinisher *f = on_readable;
+      on_readable = 0;
+      f->complete(error);
+    }
+    return;
+  }
   _prefetch();
 }
 
@@ -966,6 +980,12 @@ bool Journaler::_is_readable()
   if (read_pos == write_pos)
     return false;
 
+  // Are we errored?  Stop here to avoid risking
+  // raising decode errors.
+  if (error != 0) {
+    return false;
+  }
+
   // Check if the retrieve bytestream has enough for an entry
   uint64_t need;
   if (journal_stream.readable(read_buf, &need)) {