]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
db/log_reader: move kBadRecord{Len,Checksum} handling into ReadRecord
authorSage Weil <sage@redhat.com>
Wed, 2 Dec 2015 21:35:20 +0000 (16:35 -0500)
committerSage Weil <sage@redhat.com>
Wed, 2 Dec 2015 21:35:20 +0000 (16:35 -0500)
The behavior here needs to depend on the WAL recovery mode.  No functional
change in this patch.

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

index 9f1b16d1ca78499ee6a59ec82a1fff093910180e..a8b3cae7f5e3796f9fe49d97cbb4d27edcfcbcdf 100644 (file)
@@ -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;
       }
     }
 
index f885c14c61205b0f7559c1faf483207a8a8146dc..93ddefaea5e6f67381ed9a534cd981a902718bc0 100644 (file)
@@ -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_".