From 78711524b75955052f240f50a398a1ee53bd2226 Mon Sep 17 00:00:00 2001 From: zensan Date: Wed, 30 Mar 2016 23:05:22 +0530 Subject: [PATCH] In all the places where log records are read, there was a check that record.size() should not be less than 12. This "magic number" seems to be the WriteBatch header (8 byte sequence and 4 byte count). Replaced all the places where "12" was used by WriteBatchInternal::kHeader. --- db/db_impl.cc | 2 +- db/repair.cc | 2 +- db/transaction_log_impl.cc | 4 ++-- db/wal_manager.cc | 2 +- db/write_batch.cc | 6 ++---- db/write_batch_internal.h | 4 ++++ tools/ldb_cmd.cc | 2 +- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index 05051032e..6124313b8 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -1186,7 +1186,7 @@ Status DBImpl::RecoverLogFiles(const std::vector& log_numbers, continue_replay_log && reader.ReadRecord(&record, &scratch, db_options_.wal_recovery_mode) && status.ok()) { - if (record.size() < 12) { + if (record.size() < WriteBatchInternal::kHeader) { reporter.Corruption(record.size(), Status::Corruption("log record too small")); continue; diff --git a/db/repair.cc b/db/repair.cc index 6aa72f792..1681fd585 100644 --- a/db/repair.cc +++ b/db/repair.cc @@ -265,7 +265,7 @@ class Repairer { mem->Ref(); int counter = 0; while (reader.ReadRecord(&record, &scratch)) { - if (record.size() < 12) { + if (record.size() < WriteBatchInternal::kHeader) { reporter.Corruption( record.size(), Status::Corruption("log record too small")); continue; diff --git a/db/transaction_log_impl.cc b/db/transaction_log_impl.cc index 624a3af99..8002d935f 100644 --- a/db/transaction_log_impl.cc +++ b/db/transaction_log_impl.cc @@ -107,7 +107,7 @@ void TransactionLogIteratorImpl::SeekToStartSequence( return; } while (RestrictedRead(&record, &scratch)) { - if (record.size() < 12) { + if (record.size() < WriteBatchInternal::kHeader) { reporter_.Corruption( record.size(), Status::Corruption("very small log record")); continue; @@ -167,7 +167,7 @@ void TransactionLogIteratorImpl::NextImpl(bool internal) { currentLogReader_->UnmarkEOF(); } while (RestrictedRead(&record, &scratch)) { - if (record.size() < 12) { + if (record.size() < WriteBatchInternal::kHeader) { reporter_.Corruption( record.size(), Status::Corruption("very small log record")); continue; diff --git a/db/wal_manager.cc b/db/wal_manager.cc index e1d911e6e..da4f33aab 100644 --- a/db/wal_manager.cc +++ b/db/wal_manager.cc @@ -455,7 +455,7 @@ Status WalManager::ReadFirstLine(const std::string& fname, if (reader.ReadRecord(&record, &scratch) && (status.ok() || !db_options_.paranoid_checks)) { - if (record.size() < 12) { + if (record.size() < WriteBatchInternal::kHeader) { reporter.Corruption(record.size(), Status::Corruption("log record too small")); // TODO read record's till the first no corrupt entry? diff --git a/db/write_batch.cc b/db/write_batch.cc index 3742ae694..4b8f87a5e 100644 --- a/db/write_batch.cc +++ b/db/write_batch.cc @@ -81,8 +81,6 @@ struct BatchContentClassifier : public WriteBatch::Handler { } // anon namespace -// WriteBatch header has an 8-byte sequence number followed by a 4-byte count. -static const size_t kHeader = 12; struct SavePoint { size_t size; // size of rep_ @@ -96,8 +94,8 @@ struct SavePoints { WriteBatch::WriteBatch(size_t reserved_bytes) : save_points_(nullptr), content_flags_(0), rep_() { - rep_.reserve((reserved_bytes > kHeader) ? reserved_bytes : kHeader); - rep_.resize(kHeader); + rep_.reserve((reserved_bytes > WriteBatchInternal::kHeader) ? reserved_bytes : WriteBatchInternal::kHeader); + rep_.resize(WriteBatchInternal::kHeader); } WriteBatch::WriteBatch(const std::string& rep) diff --git a/db/write_batch_internal.h b/db/write_batch_internal.h index 1e7f61e69..3987645ef 100644 --- a/db/write_batch_internal.h +++ b/db/write_batch_internal.h @@ -63,6 +63,10 @@ class ColumnFamilyMemTablesDefault : public ColumnFamilyMemTables { // WriteBatch that we don't want in the public WriteBatch interface. class WriteBatchInternal { public: + + // WriteBatch header has an 8-byte sequence number followed by a 4-byte count. + static const size_t kHeader = 12; + // WriteBatch methods with column_family_id instead of ColumnFamilyHandle* static void Put(WriteBatch* batch, uint32_t column_family_id, const Slice& key, const Slice& value); diff --git a/tools/ldb_cmd.cc b/tools/ldb_cmd.cc index be743955d..2f4c3e2ad 100644 --- a/tools/ldb_cmd.cc +++ b/tools/ldb_cmd.cc @@ -1576,7 +1576,7 @@ void DumpWalFile(std::string wal_file, bool print_header, bool print_values, } while (reader.ReadRecord(&record, &scratch)) { row.str(""); - if (record.size() < 12) { + if (record.size() < WriteBatchInternal::kHeader) { reporter.Corruption(record.size(), Status::Corruption("log record too small")); } else {