mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-27 20:43:57 +00:00
0e04ef1a96
Summary: The following rules were deshimmed: ``` //folly/experimental/coro:accumulate -> //folly/coro:accumulate //folly/experimental/coro:async_generator -> //folly/coro:async_generator //folly/experimental/coro:async_pipe -> //folly/coro:async_pipe //folly/experimental/coro:async_scope -> //folly/coro:async_scope //folly/experimental/coro:async_stack -> //folly/coro:async_stack //folly/experimental/coro:baton -> //folly/coro:baton //folly/experimental/coro:blocking_wait -> //folly/coro:blocking_wait //folly/experimental/coro:collect -> //folly/coro:collect //folly/experimental/coro:concat -> //folly/coro:concat //folly/experimental/coro:coroutine -> //folly/coro:coroutine //folly/experimental/coro:current_executor -> //folly/coro:current_executor //folly/experimental/coro:detach_on_cancel -> //folly/coro:detach_on_cancel //folly/experimental/coro:detail_barrier -> //folly/coro:detail_barrier //folly/experimental/coro:detail_barrier_task -> //folly/coro:detail_barrier_task //folly/experimental/coro:detail_current_async_frame -> //folly/coro:detail_current_async_frame //folly/experimental/coro:detail_helpers -> //folly/coro:detail_helpers //folly/experimental/coro:detail_malloc -> //folly/coro:detail_malloc //folly/experimental/coro:detail_manual_lifetime -> //folly/coro:detail_manual_lifetime //folly/experimental/coro:detail_traits -> //folly/coro:detail_traits //folly/experimental/coro:filter -> //folly/coro:filter //folly/experimental/coro:future_util -> //folly/coro:future_util //folly/experimental/coro:generator -> //folly/coro:generator //folly/experimental/coro:gmock_helpers -> //folly/coro:gmock_helpers //folly/experimental/coro:gtest_helpers -> //folly/coro:gtest_helpers //folly/experimental/coro:inline_task -> //folly/coro:inline_task //folly/experimental/coro:invoke -> //folly/coro:invoke //folly/experimental/coro:merge -> //folly/coro:merge //folly/experimental/coro:mutex -> //folly/coro:mutex //folly/experimental/coro:promise -> //folly/coro:promise //folly/experimental/coro:result -> //folly/coro:result //folly/experimental/coro:retry -> //folly/coro:retry //folly/experimental/coro:rust_adaptors -> //folly/coro:rust_adaptors //folly/experimental/coro:scope_exit -> //folly/coro:scope_exit //folly/experimental/coro:shared_lock -> //folly/coro:shared_lock //folly/experimental/coro:shared_mutex -> //folly/coro:shared_mutex //folly/experimental/coro:sleep -> //folly/coro:sleep //folly/experimental/coro:small_unbounded_queue -> //folly/coro:small_unbounded_queue //folly/experimental/coro:task -> //folly/coro:task //folly/experimental/coro:timed_wait -> //folly/coro:timed_wait //folly/experimental/coro:timeout -> //folly/coro:timeout //folly/experimental/coro:traits -> //folly/coro:traits //folly/experimental/coro:transform -> //folly/coro:transform //folly/experimental/coro:unbounded_queue -> //folly/coro:unbounded_queue //folly/experimental/coro:via_if_async -> //folly/coro:via_if_async //folly/experimental/coro:with_async_stack -> //folly/coro:with_async_stack //folly/experimental/coro:with_cancellation -> //folly/coro:with_cancellation //folly/experimental/coro:bounded_queue -> //folly/coro:bounded_queue //folly/experimental/coro:shared_promise -> //folly/coro:shared_promise //folly/experimental/coro:cleanup -> //folly/coro:cleanup //folly/experimental/coro:auto_cleanup_fwd -> //folly/coro:auto_cleanup_fwd //folly/experimental/coro:auto_cleanup -> //folly/coro:auto_cleanup ``` The following headers were deshimmed: ``` folly/experimental/coro/Accumulate.h -> folly/coro/Accumulate.h folly/experimental/coro/Accumulate-inl.h -> folly/coro/Accumulate-inl.h folly/experimental/coro/AsyncGenerator.h -> folly/coro/AsyncGenerator.h folly/experimental/coro/AsyncPipe.h -> folly/coro/AsyncPipe.h folly/experimental/coro/AsyncScope.h -> folly/coro/AsyncScope.h folly/experimental/coro/AsyncStack.h -> folly/coro/AsyncStack.h folly/experimental/coro/Baton.h -> folly/coro/Baton.h folly/experimental/coro/BlockingWait.h -> folly/coro/BlockingWait.h folly/experimental/coro/Collect.h -> folly/coro/Collect.h folly/experimental/coro/Collect-inl.h -> folly/coro/Collect-inl.h folly/experimental/coro/Concat.h -> folly/coro/Concat.h folly/experimental/coro/Concat-inl.h -> folly/coro/Concat-inl.h folly/experimental/coro/Coroutine.h -> folly/coro/Coroutine.h folly/experimental/coro/CurrentExecutor.h -> folly/coro/CurrentExecutor.h folly/experimental/coro/DetachOnCancel.h -> folly/coro/DetachOnCancel.h folly/experimental/coro/detail/Barrier.h -> folly/coro/detail/Barrier.h folly/experimental/coro/detail/BarrierTask.h -> folly/coro/detail/BarrierTask.h folly/experimental/coro/detail/CurrentAsyncFrame.h -> folly/coro/detail/CurrentAsyncFrame.h folly/experimental/coro/detail/Helpers.h -> folly/coro/detail/Helpers.h folly/experimental/coro/detail/Malloc.h -> folly/coro/detail/Malloc.h folly/experimental/coro/detail/ManualLifetime.h -> folly/coro/detail/ManualLifetime.h folly/experimental/coro/detail/Traits.h -> folly/coro/detail/Traits.h folly/experimental/coro/Filter.h -> folly/coro/Filter.h folly/experimental/coro/Filter-inl.h -> folly/coro/Filter-inl.h folly/experimental/coro/FutureUtil.h -> folly/coro/FutureUtil.h folly/experimental/coro/Generator.h -> folly/coro/Generator.h folly/experimental/coro/GmockHelpers.h -> folly/coro/GmockHelpers.h folly/experimental/coro/GtestHelpers.h -> folly/coro/GtestHelpers.h folly/experimental/coro/detail/InlineTask.h -> folly/coro/detail/InlineTask.h folly/experimental/coro/Invoke.h -> folly/coro/Invoke.h folly/experimental/coro/Merge.h -> folly/coro/Merge.h folly/experimental/coro/Merge-inl.h -> folly/coro/Merge-inl.h folly/experimental/coro/Mutex.h -> folly/coro/Mutex.h folly/experimental/coro/Promise.h -> folly/coro/Promise.h folly/experimental/coro/Result.h -> folly/coro/Result.h folly/experimental/coro/Retry.h -> folly/coro/Retry.h folly/experimental/coro/RustAdaptors.h -> folly/coro/RustAdaptors.h folly/experimental/coro/ScopeExit.h -> folly/coro/ScopeExit.h folly/experimental/coro/SharedLock.h -> folly/coro/SharedLock.h folly/experimental/coro/SharedMutex.h -> folly/coro/SharedMutex.h folly/experimental/coro/Sleep.h -> folly/coro/Sleep.h folly/experimental/coro/Sleep-inl.h -> folly/coro/Sleep-inl.h folly/experimental/coro/SmallUnboundedQueue.h -> folly/coro/SmallUnboundedQueue.h folly/experimental/coro/Task.h -> folly/coro/Task.h folly/experimental/coro/TimedWait.h -> folly/coro/TimedWait.h folly/experimental/coro/Timeout.h -> folly/coro/Timeout.h folly/experimental/coro/Timeout-inl.h -> folly/coro/Timeout-inl.h folly/experimental/coro/Traits.h -> folly/coro/Traits.h folly/experimental/coro/Transform.h -> folly/coro/Transform.h folly/experimental/coro/Transform-inl.h -> folly/coro/Transform-inl.h folly/experimental/coro/UnboundedQueue.h -> folly/coro/UnboundedQueue.h folly/experimental/coro/ViaIfAsync.h -> folly/coro/ViaIfAsync.h folly/experimental/coro/WithAsyncStack.h -> folly/coro/WithAsyncStack.h folly/experimental/coro/WithCancellation.h -> folly/coro/WithCancellation.h folly/experimental/coro/BoundedQueue.h -> folly/coro/BoundedQueue.h folly/experimental/coro/SharedPromise.h -> folly/coro/SharedPromise.h folly/experimental/coro/Cleanup.h -> folly/coro/Cleanup.h folly/experimental/coro/AutoCleanup-fwd.h -> folly/coro/AutoCleanup-fwd.h folly/experimental/coro/AutoCleanup.h -> folly/coro/AutoCleanup.h ``` This is a codemod. It was automatically generated and will be landed once it is approved and tests are passing in sandcastle. You have been added as a reviewer by Sentinel or Butterfly. Autodiff project: dcoro Autodiff partition: fbcode.internal_repo_rocksdb Autodiff bookmark: ad.dcoro.fbcode.internal_repo_rocksdb Reviewed By: dtolnay Differential Revision: D62684411 fbshipit-source-id: 8dbd31ab64fcdd99435d322035b9668e3200e0a3
145 lines
5.1 KiB
C++
145 lines
5.1 KiB
C++
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
//
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).#pragma once
|
|
#pragma once
|
|
|
|
#if USE_COROUTINES
|
|
#include "file/random_access_file_reader.h"
|
|
#include "folly/coro/ViaIfAsync.h"
|
|
#include "port/port.h"
|
|
#include "rocksdb/file_system.h"
|
|
#include "rocksdb/statistics.h"
|
|
#include "util/autovector.h"
|
|
#include "util/stop_watch.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
class SingleThreadExecutor;
|
|
|
|
// AsyncFileReader implements the Awaitable concept, which allows calling
|
|
// coroutines to co_await it. When the AsyncFileReader Awaitable is
|
|
// resumed, it initiates the fie reads requested by the awaiting caller
|
|
// by calling RandomAccessFileReader's ReadAsync. It then suspends the
|
|
// awaiting coroutine. The suspended awaiter is later resumed by Wait().
|
|
class AsyncFileReader {
|
|
class ReadAwaiter;
|
|
template <typename Awaiter>
|
|
class ReadOperation;
|
|
|
|
public:
|
|
AsyncFileReader(FileSystem* fs, Statistics* stats) : fs_(fs), stats_(stats) {}
|
|
|
|
~AsyncFileReader() {}
|
|
|
|
ReadOperation<ReadAwaiter> MultiReadAsync(RandomAccessFileReader* file,
|
|
const IOOptions& opts,
|
|
FSReadRequest* read_reqs,
|
|
size_t num_reqs,
|
|
AlignedBuf* aligned_buf) noexcept {
|
|
return ReadOperation<ReadAwaiter>{*this, file, opts,
|
|
read_reqs, num_reqs, aligned_buf};
|
|
}
|
|
|
|
private:
|
|
friend SingleThreadExecutor;
|
|
|
|
// Implementation of the Awaitable concept
|
|
class ReadAwaiter {
|
|
public:
|
|
explicit ReadAwaiter(AsyncFileReader& reader, RandomAccessFileReader* file,
|
|
const IOOptions& opts, FSReadRequest* read_reqs,
|
|
size_t num_reqs, AlignedBuf* /*aligned_buf*/) noexcept
|
|
: reader_(reader),
|
|
file_(file),
|
|
opts_(opts),
|
|
read_reqs_(read_reqs),
|
|
num_reqs_(num_reqs),
|
|
next_(nullptr) {}
|
|
|
|
bool await_ready() noexcept { return false; }
|
|
|
|
// A return value of true means suspend the awaiter (calling coroutine). The
|
|
// awaiting_coro parameter is the handle of the awaiter. The handle can be
|
|
// resumed later, so we cache it here.
|
|
bool await_suspend(
|
|
folly::coro::impl::coroutine_handle<> awaiting_coro) noexcept {
|
|
awaiting_coro_ = awaiting_coro;
|
|
// MultiReadAsyncImpl always returns true, so caller will be suspended
|
|
return reader_.MultiReadAsyncImpl(this);
|
|
}
|
|
|
|
void await_resume() noexcept {}
|
|
|
|
private:
|
|
friend AsyncFileReader;
|
|
|
|
// The parameters passed to MultiReadAsync are cached here when the caller
|
|
// calls MultiReadAsync. Later, when the execution of this awaitable is
|
|
// started, these are used to do the actual IO
|
|
AsyncFileReader& reader_;
|
|
RandomAccessFileReader* file_;
|
|
const IOOptions& opts_;
|
|
FSReadRequest* read_reqs_;
|
|
size_t num_reqs_;
|
|
autovector<void*, 32> io_handle_;
|
|
autovector<IOHandleDeleter, 32> del_fn_;
|
|
folly::coro::impl::coroutine_handle<> awaiting_coro_;
|
|
// Use this to link to the next ReadAwaiter in the suspended coroutine
|
|
// list. The head and tail of the list are tracked by AsyncFileReader.
|
|
// We use this approach rather than an STL container in order to avoid
|
|
// extra memory allocations. The coroutine call already allocates a
|
|
// ReadAwaiter object.
|
|
ReadAwaiter* next_;
|
|
};
|
|
|
|
// An instance of ReadOperation is returned to the caller of MultiGetAsync.
|
|
// This represents an awaitable that can be started later.
|
|
template <typename Awaiter>
|
|
class ReadOperation {
|
|
public:
|
|
explicit ReadOperation(AsyncFileReader& reader,
|
|
RandomAccessFileReader* file, const IOOptions& opts,
|
|
FSReadRequest* read_reqs, size_t num_reqs,
|
|
AlignedBuf* aligned_buf) noexcept
|
|
: reader_(reader),
|
|
file_(file),
|
|
opts_(opts),
|
|
read_reqs_(read_reqs),
|
|
num_reqs_(num_reqs),
|
|
aligned_buf_(aligned_buf) {}
|
|
|
|
auto viaIfAsync(folly::Executor::KeepAlive<> executor) const {
|
|
return folly::coro::co_viaIfAsync(
|
|
std::move(executor),
|
|
Awaiter{reader_, file_, opts_, read_reqs_, num_reqs_, aligned_buf_});
|
|
}
|
|
|
|
private:
|
|
AsyncFileReader& reader_;
|
|
RandomAccessFileReader* file_;
|
|
const IOOptions& opts_;
|
|
FSReadRequest* read_reqs_;
|
|
size_t num_reqs_;
|
|
AlignedBuf* aligned_buf_;
|
|
};
|
|
|
|
// This function does the actual work when this awaitable starts execution
|
|
bool MultiReadAsyncImpl(ReadAwaiter* awaiter);
|
|
|
|
// Called by the SingleThreadExecutor to poll for async IO completion.
|
|
// This also resumes the awaiting coroutines.
|
|
void Wait();
|
|
|
|
// Head of the queue of awaiters waiting for async IO completion
|
|
ReadAwaiter* head_ = nullptr;
|
|
// Tail of the awaiter queue
|
|
ReadAwaiter* tail_ = nullptr;
|
|
// Total number of pending async IOs
|
|
size_t num_reqs_ = 0;
|
|
FileSystem* fs_;
|
|
Statistics* stats_;
|
|
};
|
|
} // namespace ROCKSDB_NAMESPACE
|
|
#endif // USE_COROUTINES
|