3#include <boost/asio/any_io_executor.hpp>
4#include <boost/asio/error.hpp>
5#include <boost/asio/io_context.hpp>
6#include <boost/asio/spawn.hpp>
7#include <boost/asio/steady_timer.hpp>
8#include <boost/asio/strand.hpp>
21 std::chrono::steady_clock::duration initialDelay_;
22 std::chrono::steady_clock::duration delay_;
36 [[nodiscard]] std::chrono::steady_clock::duration
55 [[nodiscard]]
virtual std::chrono::steady_clock::duration
58using RetryStrategyPtr = std::unique_ptr<RetryStrategy>;
64 RetryStrategyPtr strategy_;
65 boost::asio::steady_timer timer_;
66 size_t attemptNumber_ = 0;
67 std::shared_ptr<std::atomic_bool> canceled_{std::make_shared<std::atomic_bool>(
false)};
76 std::chrono::steady_clock::duration initial;
77 std::chrono::steady_clock::duration max;
87 RetryStrategyPtr strategy,
88 boost::asio::strand<boost::asio::io_context::executor_type> strand
99 Retry(RetryStrategyPtr strategy, boost::asio::any_io_executor executor);
112 template <
typename Fn>
117 timer_.expires_after(strategy_->getDelay());
118 strategy_->increaseDelay();
119 timer_.async_wait([
this,
120 canceled = canceled_,
121 func = std::forward<Fn>(func)](boost::system::error_code
const& ec) {
122 if (ec == boost::asio::error::operation_aborted or *canceled) {
139 wait(boost::asio::yield_context yield);
156 [[nodiscard]] std::chrono::steady_clock::duration
170 std::chrono::steady_clock::duration maxDelay_;
181 [[nodiscard]] std::chrono::steady_clock::duration
195 boost::asio::strand<boost::asio::io_context::executor_type> strand
ExponentialBackoffStrategy(Retry::Delays delays)
Construct a new Exponential Backoff Strategy object.
Definition Retry.cpp:86
std::chrono::steady_clock::duration getDelay() const
Definition Retry.cpp:25
RetryStrategy(std::chrono::steady_clock::duration delay)
Construct a new Retry Strategy object.
Definition Retry.cpp:19
void reset()
Reset the delay value.
Definition Retry.cpp:37
virtual std::chrono::steady_clock::duration nextDelay() const =0
void increaseDelay()
Increase the delay value.
Definition Retry.cpp:31
A retry mechanism.
Definition Retry.hpp:63
size_t attemptNumber() const
Definition Retry.cpp:68
Retry(RetryStrategyPtr strategy, boost::asio::strand< boost::asio::io_context::executor_type > strand)
Construct a new Retry object.
Definition Retry.cpp:42
std::chrono::steady_clock::duration delayValue() const
Definition Retry.cpp:74
~Retry()
Destroy the Retry object.
Definition Retry.cpp:55
void retry(Fn &&func)
Schedule a retry.
Definition Retry.hpp:114
void reset()
Reset the delay value and attempt number.
Definition Retry.cpp:80
void wait(boost::asio::yield_context yield)
Wait out the current delay by suspending the calling coroutine, then back off.
Definition Retry.cpp:99
void cancel()
Cancel scheduled retry if any.
Definition Retry.cpp:61
This namespace contains various utilities.
Definition HandlerRegistry.hpp:24
Retry makeRetryExponentialBackoff(Retry::Delays delays, boost::asio::strand< boost::asio::io_context::executor_type > strand)
Create a retry mechanism with exponential backoff strategy.
Definition Retry.cpp:120
The delays to use between retry attempts.
Definition Retry.hpp:75