]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
db/log_reader: treat bad record length or checksum as kEof
authorSage Weil <sage@redhat.com>
Wed, 2 Dec 2015 21:38:46 +0000 (16:38 -0500)
committerSage Weil <sage@redhat.com>
Wed, 2 Dec 2015 21:38:46 +0000 (16:38 -0500)
If we are in kTolerateCorruptedTailRecords, treat these errors as the
end of the log.  This is particularly important for recycled logs, where
we will regularly see corrupted headers (bad length or checksum) when
replaying a log.  If we are aligned with a block boundary or get lucky,
we will land on an old header and see the log nubmer mismatch, but more
commonly we will land midway through some previously and effectively
see noise.

Signed-off-by: Sage Weil <sage@redhat.com>
db/log_reader.cc

index a8b3cae7f5e3796f9fe49d97cbb4d27edcfcbcdf..3732a911c85c0ed4bec41e0dd656f4c337a6f0ad 100644 (file)
@@ -194,6 +194,11 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
         break;
 
       case kBadRecordLen:
+        if (wal_recovery_mode ==
+           WALRecoveryMode::kTolerateCorruptedTailRecords) {
+         scratch->clear();
+          return false;
+       }
        ReportCorruption(drop_size, "bad record length");
        if (in_fragmented_record) {
           ReportCorruption(scratch->size(), "error in middle of record");
@@ -203,6 +208,11 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch,
         break;
 
       case kBadRecordChecksum:
+       if (wal_recovery_mode ==
+           WALRecoveryMode::kTolerateCorruptedTailRecords) {
+         scratch->clear();
+          return false;
+       }
         ReportCorruption(drop_size, "checksum mismatch");
         if (in_fragmented_record) {
           ReportCorruption(scratch->size(), "error in middle of record");