diff options
author | Andrew Kryczka <andrew.kryczka2@gmail.com> | 2024-05-22 15:34:37 -0700 |
---|---|---|
committer | Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com> | 2024-05-22 15:34:37 -0700 |
commit | c72ee4531b288bf08b9414155fafb86cc4378fb4 (patch) | |
tree | f73d33bb0ac1d9b3de7b926479265ec16ea570fe /db/log_reader.cc | |
parent | db0960800a2971e94c73d7e7eb1bd2e9b8d3c54c (diff) |
Fix recycled WAL detection when wal_compression is enabled (#12643)
Summary:
I think the point of the `if (end_of_buffer_offset_ - buffer_.size() == 0)` was to only set `recycled_` when the first record was read. However, the condition was false when reading the first record when the WAL began with a `kSetCompressionType` record because we had already dropped the `kSetCompressionType` record from `buffer_`. To fix this, I used `first_record_read_` instead.
Also, it was pretty confusing to treat the WAL as non-recycled when a recyclable record first appeared in a non-first record. I changed it to return an error if that happens.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/12643
Reviewed By: hx235
Differential Revision: D57238099
Pulled By: ajkr
fbshipit-source-id: e20a2a0c9cf0c9510a7b6af463650a05d559239e
Diffstat (limited to 'db/log_reader.cc')
-rw-r--r-- | db/log_reader.cc | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/db/log_reader.cc b/db/log_reader.cc index 110eb2c27..d6eefec05 100644 --- a/db/log_reader.cc +++ b/db/log_reader.cc @@ -487,9 +487,11 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size, type == kRecyclableUserDefinedTimestampSizeType); if (is_recyclable_type) { header_size = kRecyclableHeaderSize; - if (end_of_buffer_offset_ - buffer_.size() == 0) { - recycled_ = true; + if (first_record_read_ && !recycled_) { + // A recycled log should have started with a recycled record + return kBadRecord; } + recycled_ = true; // We need enough for the larger header if (buffer_.size() < static_cast<size_t>(kRecyclableHeaderSize)) { int r = kEof; @@ -867,9 +869,12 @@ bool FragmentBufferedReader::TryReadFragment( int header_size = kHeaderSize; if ((type >= kRecyclableFullType && type <= kRecyclableLastType) || type == kRecyclableUserDefinedTimestampSizeType) { - if (end_of_buffer_offset_ - buffer_.size() == 0) { - recycled_ = true; + if (first_record_read_ && !recycled_) { + // A recycled log should have started with a recycled record + *fragment_type_or_err = kBadRecord; + return true; } + recycled_ = true; header_size = kRecyclableHeaderSize; while (buffer_.size() < static_cast<size_t>(kRecyclableHeaderSize)) { size_t old_size = buffer_.size(); |