3#include <boost/asio/error.hpp>
4#include <boost/asio/io_context.hpp>
5#include <boost/asio/steady_timer.hpp>
6#include <boost/asio/strand.hpp>
19 std::chrono::steady_clock::duration initialDelay_;
20 std::chrono::steady_clock::duration delay_;
34 std::chrono::steady_clock::duration
53 virtual std::chrono::steady_clock::duration
56using RetryStrategyPtr = std::unique_ptr<RetryStrategy>;
62 RetryStrategyPtr strategy_;
63 boost::asio::steady_timer timer_;
64 size_t attemptNumber_ = 0;
65 std::shared_ptr<std::atomic_bool> canceled_{std::make_shared<std::atomic_bool>(
false)};
75 RetryStrategyPtr strategy,
76 boost::asio::strand<boost::asio::io_context::executor_type> strand
90 template <
typename Fn>
95 timer_.expires_after(strategy_->getDelay());
96 strategy_->increaseDelay();
97 timer_.async_wait([
this,
99 func = std::forward<Fn>(func)](boost::system::error_code
const& ec) {
100 if (ec == boost::asio::error::operation_aborted or *canceled) {
123 std::chrono::steady_clock::duration
137 std::chrono::steady_clock::duration maxDelay_;
147 std::chrono::steady_clock::duration delay,
148 std::chrono::steady_clock::duration maxDelay
152 std::chrono::steady_clock::duration
166 std::chrono::steady_clock::duration delay,
167 std::chrono::steady_clock::duration maxDelay,
168 boost::asio::strand<boost::asio::io_context::executor_type> strand
ExponentialBackoffStrategy(std::chrono::steady_clock::duration delay, std::chrono::steady_clock::duration maxDelay)
Construct a new Exponential Backoff Strategy object.
Definition Retry.cpp:76
std::chrono::steady_clock::duration getDelay() const
Definition Retry.cpp:20
RetryStrategy(std::chrono::steady_clock::duration delay)
Construct a new Retry Strategy object.
Definition Retry.cpp:14
void reset()
Reset the delay value.
Definition Retry.cpp:32
virtual std::chrono::steady_clock::duration nextDelay() const =0
void increaseDelay()
Increase the delay value.
Definition Retry.cpp:26
A retry mechanism.
Definition Retry.hpp:61
size_t attemptNumber() const
Definition Retry.cpp:58
Retry(RetryStrategyPtr strategy, boost::asio::strand< boost::asio::io_context::executor_type > strand)
Construct a new Retry object.
Definition Retry.cpp:37
std::chrono::steady_clock::duration delayValue() const
Definition Retry.cpp:64
~Retry()
Destroy the Retry object.
Definition Retry.cpp:45
void retry(Fn &&func)
Schedule a retry.
Definition Retry.hpp:92
void reset()
Reset the delay value and attempt number.
Definition Retry.cpp:70
void cancel()
Cancel scheduled retry if any.
Definition Retry.cpp:51
This namespace contains various utilities.
Definition AccountUtils.hpp:11
Retry makeRetryExponentialBackoff(std::chrono::steady_clock::duration delay, std::chrono::steady_clock::duration maxDelay, boost::asio::strand< boost::asio::io_context::executor_type > strand)
Create a retry mechanism with exponential backoff strategy.
Definition Retry.cpp:92