Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
Retry.hpp
1#pragma once
2
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>
7
8#include <atomic>
9#include <chrono>
10#include <cstddef>
11#include <memory>
12
13namespace util {
14
19 std::chrono::steady_clock::duration initialDelay_;
20 std::chrono::steady_clock::duration delay_;
21
22public:
28 RetryStrategy(std::chrono::steady_clock::duration delay);
29 virtual ~RetryStrategy() = default;
30
34 std::chrono::steady_clock::duration
35 getDelay() const;
36
40 void
42
46 void
47 reset();
48
49protected:
53 virtual std::chrono::steady_clock::duration
54 nextDelay() const = 0;
55};
56using RetryStrategyPtr = std::unique_ptr<RetryStrategy>;
57
61class Retry {
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)};
66
67public:
74 Retry(
75 RetryStrategyPtr strategy,
76 boost::asio::strand<boost::asio::io_context::executor_type> strand
77 );
78
82 ~Retry();
83
90 template <typename Fn>
91 void
92 retry(Fn&& func)
93 {
94 *canceled_ = false;
95 timer_.expires_after(strategy_->getDelay());
96 strategy_->increaseDelay();
97 timer_.async_wait([this,
98 canceled = canceled_,
99 func = std::forward<Fn>(func)](boost::system::error_code const& ec) {
100 if (ec == boost::asio::error::operation_aborted or *canceled) {
101 return;
102 }
103 ++attemptNumber_;
104 func();
105 });
106 }
107
111 void
112 cancel();
113
117 size_t
118 attemptNumber() const;
119
123 std::chrono::steady_clock::duration
124 delayValue() const;
125
129 void
130 reset();
131};
132
137 std::chrono::steady_clock::duration maxDelay_;
138
139public:
147 std::chrono::steady_clock::duration delay,
148 std::chrono::steady_clock::duration maxDelay
149 );
150
151private:
152 std::chrono::steady_clock::duration
153 nextDelay() const override;
154};
155
164Retry
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
169);
170
171} // namespace util
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