From 23b69dff57212ddf0d6bd1f62e65377b44d4d75a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 9 Oct 2015 12:02:39 -0400 Subject: [PATCH] kBadHeader --- db/log_reader.cc | 16 +++++++++++----- db/log_reader.h | 4 +++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/db/log_reader.cc b/db/log_reader.cc index 3c3fab3a..2d6a355d 100644 --- a/db/log_reader.cc +++ b/db/log_reader.cc @@ -143,6 +143,13 @@ bool Reader::ReadRecord(Slice* record, std::string* scratch, } break; + case kBadHeader: + if (wal_recovery_mode == WALRecoveryMode::kAbsoluteConsistency) { + // in clean shutdown we don't expect any error in the log files + ReportCorruption(buffer_.size(), "truncated header"); + } + // fall-thru + case kEof: if (in_fragmented_record) { if (wal_recovery_mode == WALRecoveryMode::kAbsoluteConsistency) { @@ -281,11 +288,10 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, // end of the file, which can be caused by the writer crashing in the // middle of writing the header. Unless explicitly requested we don't // considering this an error, just report EOF. - if (buffer_.size() && - wal_recovery_mode == WALRecoveryMode::kAbsoluteConsistency) { - // in clean shutdown we don't expect any error in the log files - ReportCorruption(buffer_.size(), "truncated header"); - } + if (buffer_.size()) { + buffer_.clear(); + return kBadHeader; + } buffer_.clear(); return kEof; } diff --git a/db/log_reader.h b/db/log_reader.h index 2a65783d..4c21c816 100644 --- a/db/log_reader.h +++ b/db/log_reader.h @@ -122,7 +122,9 @@ class Reader { // * The record has an invalid CRC (ReadPhysicalRecord reports a drop) // * The record is a 0-length record (No drop is reported) // * The record is below constructor's initial_offset (No drop is reported) - kBadRecord = kMaxRecordType + 2 + kBadRecord = kMaxRecordType + 2, + // Returned when we fail to read a valid header. + kBadHeader = kMaxRecordType + 3, }; // Skips all blocks that are completely before "initial_offset_". -- 2.47.3