fix ReadaheadRandomAccessFile/iterator prefetch bug #3454
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
ReadaheadRandomAccessFile
is used by iterators for file reads in several cases, like in compaction whencompaction_readahead_size > 0
oruse_direct_io_for_flush_and_compaction == true
, or in user iterator whenReadOptions::readahead_size > 0
.ReadaheadRandomAccessFile
maintains an internal buffer for readahead data. It assumes that, if the buffer's length is less thanReadaheadRandomAccessFile::readahead_size_
, which is fixed in the constructor, then EOF has been reached so it doesn't try reading further.Recently, d938226 started calling
RandomAccessFile::Prefetch
with various lengths: 8KB, 16KB, etc. When theRandomAccessFile
is aReadaheadRandomAccessFile
, it triggers the above condition and incorrectly determines EOF. If a block is partially in the readahead buffer and EOF is incorrectly decided, the result is a truncated data block.The problem is reproducible:
Test Plan:
db_bench
with various options that previously failed; now they passmake check -j64