]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Fix reseting of async_read_in_progress_ variable in FilePrefetchBuffer to call Poll...
authorAkanksha Mahajan <akankshamahajan@fb.com>
Thu, 7 Apr 2022 01:36:23 +0000 (18:36 -0700)
committerakankshamahajan <akankshamahajan@fb.com>
Thu, 7 Apr 2022 16:03:53 +0000 (09:03 -0700)
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

file/file_prefetch_buffer.cc

index ef349c2b8157618ef29a069da9ccf838902d3425..1fce53b65a0b1f87c887a6208de5a2af4ffd3968 100644 (file)
@@ -231,7 +231,10 @@ Status FilePrefetchBuffer::PrefetchAsync(const IOOptions& opts,
     handles.emplace_back(io_handle_);
     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) {
     del_fn_(io_handle_);
     io_handle_ = nullptr;
@@ -512,7 +515,6 @@ bool FilePrefetchBuffer::TryReadFromCacheAsync(
 
 void FilePrefetchBuffer::PrefetchAsyncCallback(const FSReadRequest& req,
                                                void* /*cb_arg*/) {
-  async_read_in_progress_ = false;
   uint32_t index = curr_ ^ 1;
   if (req.status.ok()) {
     if (req.offset + req.result.size() <=