diff --git a/util/file_reader_writer.cc b/util/file_reader_writer.cc index 9175fa502f94ff85ff300aa659b784501d12ed7f..b6a5eefcfdb12602e2095e5cde017a76fe4a5dc2 100644 --- a/util/file_reader_writer.cc +++ b/util/file_reader_writer.cc @@ -738,7 +738,7 @@ private: if (s.ok()) { buffer_offset_ = offset; buffer_.Size(result.size()); - assert(buffer_.BufferStart() == result.data()); + assert(result.size() == 0 || buffer_.BufferStart() == result.data()); } return s; } @@ -886,7 +886,7 @@ class ReadaheadSequentialFile : public SequentialFile { if (s.ok()) { buffer_offset_ = read_offset_; buffer_.Size(result.size()); - assert(buffer_.BufferStart() == result.data()); + assert(result.size() == 0 || buffer_.BufferStart() == result.data()); } return s; } @@ -1027,6 +1027,11 @@ std::unique_ptr NewReadaheadRandomAccessFile( std::unique_ptr SequentialFileReader::NewReadaheadSequentialFile( std::unique_ptr&& file, size_t readahead_size) { + if (file->GetRequiredBufferAlignment() >= readahead_size) { + // Short-circuit and return the original file if readahead_size is + // too small and hence doesn't make sense to be used for prefetching. + return std::move(file); + } std::unique_ptr result( new ReadaheadSequentialFile(std::move(file), readahead_size)); return result; diff --git a/util/file_reader_writer_test.cc b/util/file_reader_writer_test.cc index aa74303b8fcc399d7509d38bb6f41420288669d9..1b86f798f7ffeb25e2ab80adea0b7c2d96c84530 100644 --- a/util/file_reader_writer_test.cc +++ b/util/file_reader_writer_test.cc @@ -325,7 +325,7 @@ class ReadaheadSequentialFileTest : public testing::Test, public testing::WithParamInterface { public: static std::vector GetReadaheadSizeList() { - return {1lu << 12, 1lu << 16}; + return {1lu << 8, 1lu << 12, 1lu << 16, 1lu << 18}; } void SetUp() override { readahead_size_ = GetParam();