summaryrefslogtreecommitdiff
path: root/db/log_reader.cc
diff options
context:
space:
mode:
authorAndrew Kryczka <andrew.kryczka2@gmail.com>2024-05-22 15:34:37 -0700
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>2024-05-22 15:34:37 -0700
commitc72ee4531b288bf08b9414155fafb86cc4378fb4 (patch)
treef73d33bb0ac1d9b3de7b926479265ec16ea570fe /db/log_reader.cc
parentdb0960800a2971e94c73d7e7eb1bd2e9b8d3c54c (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.cc13
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();