Fix reseting of async_read_in_progress_ variable in FilePrefetchBuffer to call Poll API (#9815)

Summary:
Currently RocksDB reset async_read_in_progress_ in callback
due to which underlying filesystem relying on Poll API won't be called
leading to stale memory access.
In order to fix it, async_read_in_progress_ will be reset after Poll API
is called to make sure underlying file_system waiting on Poll can clear
its state or take appropriate action.

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

Test Plan: CircleCI tests

Reviewed By: anand1976

Differential Revision: D35451534

Pulled By: akankshamahajan15

fbshipit-source-id: b70ef6251a7aa9ed4876ba5e5100baa33d7d474c
main
Akanksha Mahajan 3 years ago committed by Facebook GitHub Bot
parent e03f8a0c12
commit 7ea26abb8b
  1. 6
      file/file_prefetch_buffer.cc

@ -231,7 +231,10 @@ Status FilePrefetchBuffer::PrefetchAsync(const IOOptions& opts,
handles.emplace_back(io_handle_); handles.emplace_back(io_handle_);
fs_->Poll(handles, 1).PermitUncheckedError(); fs_->Poll(handles, 1).PermitUncheckedError();
} }
// Release io_handle_ after the Poll API as request has been completed.
// Reset and Release io_handle_ after the Poll API as request has been
// completed.
async_read_in_progress_ = false;
if (io_handle_ != nullptr && del_fn_ != nullptr) { if (io_handle_ != nullptr && del_fn_ != nullptr) {
del_fn_(io_handle_); del_fn_(io_handle_);
io_handle_ = nullptr; io_handle_ = nullptr;
@ -512,7 +515,6 @@ bool FilePrefetchBuffer::TryReadFromCacheAsync(
void FilePrefetchBuffer::PrefetchAsyncCallback(const FSReadRequest& req, void FilePrefetchBuffer::PrefetchAsyncCallback(const FSReadRequest& req,
void* /*cb_arg*/) { void* /*cb_arg*/) {
async_read_in_progress_ = false;
uint32_t index = curr_ ^ 1; uint32_t index = curr_ ^ 1;
if (req.status.ok()) { if (req.status.ok()) {
if (req.offset + req.result.size() <= if (req.offset + req.result.size() <=

Loading…
Cancel
Save