From: Sage Weil Date: Wed, 2 Dec 2015 21:38:46 +0000 (-0500) Subject: db/log_reader: treat bad record length or checksum as kEof X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f8f92078247066ae57dd16079258e2452addd9b0;p=rocksdb.git db/log_reader: treat bad record length or checksum as kEof 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 --- diff --git a/db/log_reader.cc b/db/log_reader.cc index a8b3cae7..3732a911 100644 --- a/db/log_reader.cc +++ b/db/log_reader.cc @@ -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");