RandomAccessFileReader::MultiRead() should not return read bytes not read (#8941)

Summary:
Right now, if underlying read returns fewer bytes than asked for, RandomAccessFileReader::MultiRead() still returns those in the buffer to upper layer. This can be a surprise to upper layer.
This is unlikely to cause incorrect data. To cause incorrect data, checksum checking in upper layer should pass with short reads, whose chance is low.

Pull Request resolved: https://github.com/facebook/rocksdb/pull/8941

Test Plan: Run stress tests for a while

Reviewed By: anand1976

Differential Revision: D31085780

fbshipit-source-id: 999adf2d6c2712f1323d14bb68b678df59969973
This commit is contained in:
sdong 2021-09-21 12:21:03 -07:00 committed by Peter Dillinger
parent 33f11b2625
commit ff033921d8

View File

@ -296,8 +296,14 @@ IOStatus RandomAccessFileReader::MultiRead(const IOOptions& opts,
r.status = fs_r.status; r.status = fs_r.status;
if (r.status.ok()) { if (r.status.ok()) {
uint64_t offset = r.offset - fs_r.offset; uint64_t offset = r.offset - fs_r.offset;
size_t len = std::min(r.len, static_cast<size_t>(fs_r.len - offset)); if (fs_r.result.size() <= offset) {
r.result = Slice(fs_r.scratch + offset, len); // No byte in the read range is returned.
r.result = Slice();
} else {
size_t len = std::min(
r.len, static_cast<size_t>(fs_r.result.size() - offset));
r.result = Slice(fs_r.scratch + offset, len);
}
} else { } else {
r.result = Slice(); r.result = Slice();
} }