From: Sage Weil Date: Wed, 2 Dec 2015 21:35:20 +0000 (-0500) Subject: db/log_reader: move kBadRecord{Len,Checksum} handling into ReadRecord X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=58244ee54f2d50ee9926e83c50c1064a48f931c9;p=rocksdb.git db/log_reader: move kBadRecord{Len,Checksum} handling into ReadRecord The behavior here needs to depend on the WAL recovery mode. No functional change in this patch. Signed-off-by: Sage Weil --- diff --git a/db/log_reader.cc b/db/log_reader.cc index 9f1b16d1..a8b3cae7 100644 --- a/db/log_reader.cc +++ b/db/log_reader.cc @@ -193,6 +193,24 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch, } break; + case kBadRecordLen: + ReportCorruption(drop_size, "bad record length"); + if (in_fragmented_record) { + ReportCorruption(scratch->size(), "error in middle of record"); + in_fragmented_record = false; + scratch->clear(); + } + break; + + case kBadRecordChecksum: + ReportCorruption(drop_size, "checksum mismatch"); + if (in_fragmented_record) { + ReportCorruption(scratch->size(), "error in middle of record"); + in_fragmented_record = false; + scratch->clear(); + } + break; + default: { char buf[40]; snprintf(buf, sizeof(buf), "unknown record type %u", record_type); @@ -357,8 +375,7 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size) { *drop_size = buffer_.size(); buffer_.clear(); if (!eof_) { - ReportCorruption(*drop_size, "bad record length"); - return kBadRecord; + return kBadRecordLen; } // If the end of the file has been reached without reading |length| bytes // of payload, assume the writer died in the middle of writing the record. @@ -391,8 +408,7 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size) { // like a valid log record. *drop_size = buffer_.size(); buffer_.clear(); - ReportCorruption(*drop_size, "checksum mismatch"); - return kBadRecord; + return kBadRecordChecksum; } } diff --git a/db/log_reader.h b/db/log_reader.h index f885c14c..93ddefae 100644 --- a/db/log_reader.h +++ b/db/log_reader.h @@ -129,6 +129,10 @@ class Reader { kBadHeader = kMaxRecordType + 3, // Returned when we read an old record from a previous user of the log. kOldRecord = kMaxRecordType + 4, + // Returned when we get a bad record length + kBadRecordLen = kMaxRecordType + 5, + // Returned when we get a bad record checksum + kBadRecordChecksum = kMaxRecordType + 6, }; // Skips all blocks that are completely before "initial_offset_".