Fix for ReadaheadSequentialFile crash in ldb_cmd_test (#5586)

Summary:
Fixing a corner case crash when there was no data read from file, but status is still OK
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5586

Differential Revision: D16348117

Pulled By: elipoz

fbshipit-source-id: f97973308024f020d8be79ca3c56466b84d80656
main
Eli Pozniansky 6 years ago committed by Facebook Github Bot
parent 8a008d4170
commit 9f5cfb8e71
  1. 9
      util/file_reader_writer.cc
  2. 2
      util/file_reader_writer_test.cc

@ -738,7 +738,7 @@ private:
if (s.ok()) { if (s.ok()) {
buffer_offset_ = offset; buffer_offset_ = offset;
buffer_.Size(result.size()); buffer_.Size(result.size());
assert(buffer_.BufferStart() == result.data()); assert(result.size() == 0 || buffer_.BufferStart() == result.data());
} }
return s; return s;
} }
@ -886,7 +886,7 @@ class ReadaheadSequentialFile : public SequentialFile {
if (s.ok()) { if (s.ok()) {
buffer_offset_ = read_offset_; buffer_offset_ = read_offset_;
buffer_.Size(result.size()); buffer_.Size(result.size());
assert(buffer_.BufferStart() == result.data()); assert(result.size() == 0 || buffer_.BufferStart() == result.data());
} }
return s; return s;
} }
@ -1027,6 +1027,11 @@ std::unique_ptr<RandomAccessFile> NewReadaheadRandomAccessFile(
std::unique_ptr<SequentialFile> std::unique_ptr<SequentialFile>
SequentialFileReader::NewReadaheadSequentialFile( SequentialFileReader::NewReadaheadSequentialFile(
std::unique_ptr<SequentialFile>&& file, size_t readahead_size) { std::unique_ptr<SequentialFile>&& 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<SequentialFile> result( std::unique_ptr<SequentialFile> result(
new ReadaheadSequentialFile(std::move(file), readahead_size)); new ReadaheadSequentialFile(std::move(file), readahead_size));
return result; return result;

@ -325,7 +325,7 @@ class ReadaheadSequentialFileTest : public testing::Test,
public testing::WithParamInterface<size_t> { public testing::WithParamInterface<size_t> {
public: public:
static std::vector<size_t> GetReadaheadSizeList() { static std::vector<size_t> GetReadaheadSizeList() {
return {1lu << 12, 1lu << 16}; return {1lu << 8, 1lu << 12, 1lu << 16, 1lu << 18};
} }
void SetUp() override { void SetUp() override {
readahead_size_ = GetParam(); readahead_size_ = GetParam();

Loading…
Cancel
Save