Merge pull request #1054 from DCEngines/magic12
Remove the Magic number 12 used in record size checks
This commit is contained in:
commit
925b5d0025
@ -1186,7 +1186,7 @@ Status DBImpl::RecoverLogFiles(const std::vector<uint64_t>& log_numbers,
|
|||||||
continue_replay_log &&
|
continue_replay_log &&
|
||||||
reader.ReadRecord(&record, &scratch, db_options_.wal_recovery_mode) &&
|
reader.ReadRecord(&record, &scratch, db_options_.wal_recovery_mode) &&
|
||||||
status.ok()) {
|
status.ok()) {
|
||||||
if (record.size() < 12) {
|
if (record.size() < WriteBatchInternal::kHeader) {
|
||||||
reporter.Corruption(record.size(),
|
reporter.Corruption(record.size(),
|
||||||
Status::Corruption("log record too small"));
|
Status::Corruption("log record too small"));
|
||||||
continue;
|
continue;
|
||||||
|
@ -265,7 +265,7 @@ class Repairer {
|
|||||||
mem->Ref();
|
mem->Ref();
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
while (reader.ReadRecord(&record, &scratch)) {
|
while (reader.ReadRecord(&record, &scratch)) {
|
||||||
if (record.size() < 12) {
|
if (record.size() < WriteBatchInternal::kHeader) {
|
||||||
reporter.Corruption(
|
reporter.Corruption(
|
||||||
record.size(), Status::Corruption("log record too small"));
|
record.size(), Status::Corruption("log record too small"));
|
||||||
continue;
|
continue;
|
||||||
|
@ -107,7 +107,7 @@ void TransactionLogIteratorImpl::SeekToStartSequence(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (RestrictedRead(&record, &scratch)) {
|
while (RestrictedRead(&record, &scratch)) {
|
||||||
if (record.size() < 12) {
|
if (record.size() < WriteBatchInternal::kHeader) {
|
||||||
reporter_.Corruption(
|
reporter_.Corruption(
|
||||||
record.size(), Status::Corruption("very small log record"));
|
record.size(), Status::Corruption("very small log record"));
|
||||||
continue;
|
continue;
|
||||||
@ -167,7 +167,7 @@ void TransactionLogIteratorImpl::NextImpl(bool internal) {
|
|||||||
currentLogReader_->UnmarkEOF();
|
currentLogReader_->UnmarkEOF();
|
||||||
}
|
}
|
||||||
while (RestrictedRead(&record, &scratch)) {
|
while (RestrictedRead(&record, &scratch)) {
|
||||||
if (record.size() < 12) {
|
if (record.size() < WriteBatchInternal::kHeader) {
|
||||||
reporter_.Corruption(
|
reporter_.Corruption(
|
||||||
record.size(), Status::Corruption("very small log record"));
|
record.size(), Status::Corruption("very small log record"));
|
||||||
continue;
|
continue;
|
||||||
|
@ -455,7 +455,7 @@ Status WalManager::ReadFirstLine(const std::string& fname,
|
|||||||
|
|
||||||
if (reader.ReadRecord(&record, &scratch) &&
|
if (reader.ReadRecord(&record, &scratch) &&
|
||||||
(status.ok() || !db_options_.paranoid_checks)) {
|
(status.ok() || !db_options_.paranoid_checks)) {
|
||||||
if (record.size() < 12) {
|
if (record.size() < WriteBatchInternal::kHeader) {
|
||||||
reporter.Corruption(record.size(),
|
reporter.Corruption(record.size(),
|
||||||
Status::Corruption("log record too small"));
|
Status::Corruption("log record too small"));
|
||||||
// TODO read record's till the first no corrupt entry?
|
// TODO read record's till the first no corrupt entry?
|
||||||
|
@ -81,8 +81,6 @@ struct BatchContentClassifier : public WriteBatch::Handler {
|
|||||||
|
|
||||||
} // anon namespace
|
} // anon namespace
|
||||||
|
|
||||||
// WriteBatch header has an 8-byte sequence number followed by a 4-byte count.
|
|
||||||
static const size_t kHeader = 12;
|
|
||||||
|
|
||||||
struct SavePoint {
|
struct SavePoint {
|
||||||
size_t size; // size of rep_
|
size_t size; // size of rep_
|
||||||
@ -96,8 +94,9 @@ struct SavePoints {
|
|||||||
|
|
||||||
WriteBatch::WriteBatch(size_t reserved_bytes)
|
WriteBatch::WriteBatch(size_t reserved_bytes)
|
||||||
: save_points_(nullptr), content_flags_(0), rep_() {
|
: save_points_(nullptr), content_flags_(0), rep_() {
|
||||||
rep_.reserve((reserved_bytes > kHeader) ? reserved_bytes : kHeader);
|
rep_.reserve((reserved_bytes > WriteBatchInternal::kHeader) ?
|
||||||
rep_.resize(kHeader);
|
reserved_bytes : WriteBatchInternal::kHeader);
|
||||||
|
rep_.resize(WriteBatchInternal::kHeader);
|
||||||
}
|
}
|
||||||
|
|
||||||
WriteBatch::WriteBatch(const std::string& rep)
|
WriteBatch::WriteBatch(const std::string& rep)
|
||||||
@ -146,7 +145,7 @@ bool WriteBatch::Handler::Continue() {
|
|||||||
|
|
||||||
void WriteBatch::Clear() {
|
void WriteBatch::Clear() {
|
||||||
rep_.clear();
|
rep_.clear();
|
||||||
rep_.resize(kHeader);
|
rep_.resize(WriteBatchInternal::kHeader);
|
||||||
|
|
||||||
content_flags_.store(0, std::memory_order_relaxed);
|
content_flags_.store(0, std::memory_order_relaxed);
|
||||||
|
|
||||||
@ -249,11 +248,11 @@ Status ReadRecordFromWriteBatch(Slice* input, char* tag,
|
|||||||
|
|
||||||
Status WriteBatch::Iterate(Handler* handler) const {
|
Status WriteBatch::Iterate(Handler* handler) const {
|
||||||
Slice input(rep_);
|
Slice input(rep_);
|
||||||
if (input.size() < kHeader) {
|
if (input.size() < WriteBatchInternal::kHeader) {
|
||||||
return Status::Corruption("malformed WriteBatch (too small)");
|
return Status::Corruption("malformed WriteBatch (too small)");
|
||||||
}
|
}
|
||||||
|
|
||||||
input.remove_prefix(kHeader);
|
input.remove_prefix(WriteBatchInternal::kHeader);
|
||||||
Slice key, value, blob;
|
Slice key, value, blob;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
Status s;
|
Status s;
|
||||||
@ -329,7 +328,9 @@ void WriteBatchInternal::SetSequence(WriteBatch* b, SequenceNumber seq) {
|
|||||||
EncodeFixed64(&b->rep_[0], seq);
|
EncodeFixed64(&b->rep_[0], seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t WriteBatchInternal::GetFirstOffset(WriteBatch* b) { return kHeader; }
|
size_t WriteBatchInternal::GetFirstOffset(WriteBatch* b) {
|
||||||
|
return WriteBatchInternal::kHeader;
|
||||||
|
}
|
||||||
|
|
||||||
void WriteBatchInternal::Put(WriteBatch* b, uint32_t column_family_id,
|
void WriteBatchInternal::Put(WriteBatch* b, uint32_t column_family_id,
|
||||||
const Slice& key, const Slice& value) {
|
const Slice& key, const Slice& value) {
|
||||||
@ -832,15 +833,16 @@ Status WriteBatchInternal::InsertInto(const WriteBatch* batch,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) {
|
void WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) {
|
||||||
assert(contents.size() >= kHeader);
|
assert(contents.size() >= WriteBatchInternal::kHeader);
|
||||||
b->rep_.assign(contents.data(), contents.size());
|
b->rep_.assign(contents.data(), contents.size());
|
||||||
b->content_flags_.store(ContentFlags::DEFERRED, std::memory_order_relaxed);
|
b->content_flags_.store(ContentFlags::DEFERRED, std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteBatchInternal::Append(WriteBatch* dst, const WriteBatch* src) {
|
void WriteBatchInternal::Append(WriteBatch* dst, const WriteBatch* src) {
|
||||||
SetCount(dst, Count(dst) + Count(src));
|
SetCount(dst, Count(dst) + Count(src));
|
||||||
assert(src->rep_.size() >= kHeader);
|
assert(src->rep_.size() >= WriteBatchInternal::kHeader);
|
||||||
dst->rep_.append(src->rep_.data() + kHeader, src->rep_.size() - kHeader);
|
dst->rep_.append(src->rep_.data() + WriteBatchInternal::kHeader,
|
||||||
|
src->rep_.size() - WriteBatchInternal::kHeader);
|
||||||
dst->content_flags_.store(
|
dst->content_flags_.store(
|
||||||
dst->content_flags_.load(std::memory_order_relaxed) |
|
dst->content_flags_.load(std::memory_order_relaxed) |
|
||||||
src->content_flags_.load(std::memory_order_relaxed),
|
src->content_flags_.load(std::memory_order_relaxed),
|
||||||
@ -852,7 +854,7 @@ size_t WriteBatchInternal::AppendedByteSize(size_t leftByteSize,
|
|||||||
if (leftByteSize == 0 || rightByteSize == 0) {
|
if (leftByteSize == 0 || rightByteSize == 0) {
|
||||||
return leftByteSize + rightByteSize;
|
return leftByteSize + rightByteSize;
|
||||||
} else {
|
} else {
|
||||||
return leftByteSize + rightByteSize - kHeader;
|
return leftByteSize + rightByteSize - WriteBatchInternal::kHeader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,6 +63,10 @@ class ColumnFamilyMemTablesDefault : public ColumnFamilyMemTables {
|
|||||||
// WriteBatch that we don't want in the public WriteBatch interface.
|
// WriteBatch that we don't want in the public WriteBatch interface.
|
||||||
class WriteBatchInternal {
|
class WriteBatchInternal {
|
||||||
public:
|
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*
|
// WriteBatch methods with column_family_id instead of ColumnFamilyHandle*
|
||||||
static void Put(WriteBatch* batch, uint32_t column_family_id,
|
static void Put(WriteBatch* batch, uint32_t column_family_id,
|
||||||
const Slice& key, const Slice& value);
|
const Slice& key, const Slice& value);
|
||||||
|
@ -1576,7 +1576,7 @@ void DumpWalFile(std::string wal_file, bool print_header, bool print_values,
|
|||||||
}
|
}
|
||||||
while (reader.ReadRecord(&record, &scratch)) {
|
while (reader.ReadRecord(&record, &scratch)) {
|
||||||
row.str("");
|
row.str("");
|
||||||
if (record.size() < 12) {
|
if (record.size() < WriteBatchInternal::kHeader) {
|
||||||
reporter.Corruption(record.size(),
|
reporter.Corruption(record.size(),
|
||||||
Status::Corruption("log record too small"));
|
Status::Corruption("log record too small"));
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user