48 int32_t num_retries = 4;
50 int32_t min_wait_ms = 100;
52 int32_t max_wait_ms = 60 * 1000;
54 int32_t total_timeout_ms = 30 * 60 * 1000;
56 double scale_factor = 2.0;
65 using Clock = std::chrono::steady_clock;
66 using Duration = std::chrono::milliseconds;
67 using TimePoint = Clock::time_point;
71 std::optional<TimePoint> ComputeDeadline()
const;
72 bool HasTimedOut(
const std::optional<TimePoint>& deadline)
const;
73 std::optional<Duration> RetryDelayWithinBudget(
74 int32_t attempt,
const std::optional<TimePoint>& deadline)
const;
75 bool WaitForNextAttempt(int32_t attempt,
76 const std::optional<TimePoint>& deadline)
const;
87enum class RetryPolicyMode {
93template <RetryPolicyMode Mode,
ErrorKind... Kinds>
95 static_assert(Mode != RetryPolicyMode::kNoRetry ||
sizeof...(Kinds) == 0,
96 "NoRetry must not include error kinds");
97 static_assert(Mode != RetryPolicyMode::kOnlyRetryOn ||
sizeof...(Kinds) > 0,
98 "OnlyRetryOn must include at least one error kind");
100 static constexpr RetryPolicyMode kMode = Mode;
101 static constexpr bool kEnabled = Mode != RetryPolicyMode::kNoRetry;
103 static constexpr bool ShouldRetry(
ErrorKind kind) {
104 if constexpr (Mode == RetryPolicyMode::kNoRetry) {
106 }
else if constexpr (Mode == RetryPolicyMode::kOnlyRetryOn) {
107 return ((kind == Kinds) || ...);
109 return !((kind == Kinds) || ...);
124inline constexpr bool kIsRetryPolicy =
false;
126template <RetryPolicyMode Mode,
ErrorKind... Kinds>
127inline constexpr bool kIsRetryPolicy<
RetryPolicy<Mode, Kinds...>> =
true;
130concept Policy = kIsRetryPolicy<std::remove_cvref_t<T>>;
138template <retry::Policy RetryPolicy>
143 : detail::RetryRunnerBase(
std::move(config)) {}
150 template <detail::RetryTask F>
151 auto Run(F&& task, int32_t* attempt_counter =
nullptr)
152 -> std::remove_cvref_t<std::invoke_result_t<F&>> {
153 ICEBERG_RETURN_UNEXPECTED(ValidatePolicyConfig());
155 const auto deadline = this->ComputeDeadline();
157 const int32_t max_attempts = this->config_.num_retries + 1;
161 if (attempt_counter !=
nullptr) {
162 *attempt_counter = attempt;
165 auto result = std::invoke(task);
166 if (result.has_value()) {
170 if (!CanRetry(result.error().kind, attempt, max_attempts, deadline)) {
174 if (!this->WaitForNextAttempt(attempt, deadline)) {
181 using TimePoint = detail::RetryRunnerBase::TimePoint;
183 Status ValidatePolicyConfig()
const {
185 if (!validation.has_value()) {
188 if (this->config_.num_retries > 0 && !RetryPolicy::kEnabled) {
189 return InvalidArgument(
"Retry policy must be enabled when num_retries > 0");
194 bool CanRetry(
ErrorKind kind, int32_t attempt, int32_t max_attempts,
195 const std::optional<TimePoint>& deadline)
const {
196 return attempt < max_attempts && !this->HasTimedOut(deadline) &&
197 RetryPolicy::ShouldRetry(kind);
204 int32_t total_timeout_ms) {
206 ErrorKind::kRetryableValidationFailed>>(
208 .min_wait_ms = min_wait_ms,
209 .max_wait_ms = max_wait_ms,
210 .total_timeout_ms = total_timeout_ms});
Utility class for running tasks with retry logic.
Definition retry_util.h:139
auto Run(F &&task, int32_t *attempt_counter=nullptr) -> std::remove_cvref_t< std::invoke_result_t< F & > >
Run a task that returns a Result<T>
Definition retry_util.h:151
RetryRunner(RetryConfig config={})
Construct a RetryRunner with the given configuration.
Definition retry_util.h:142
Definition retry_util.h:61
Status ValidateConfig() const
Validate retry counts and timing bounds.
int32_t CalculateDelay(int32_t attempt) const
Calculate delay with exponential backoff and jitter.
Definition expected.h:1199
Definition retry_util.h:41
Definition retry_util.h:130
Define symbol visibility macros for core Iceberg APIs.
Define common Iceberg utility macros.
Core Apache Iceberg C++ APIs.
Definition arrow_io_util.h:34
ICEBERG_EXPORT auto MakeCommitRetryRunner(int32_t num_retries, int32_t min_wait_ms, int32_t max_wait_ms, int32_t total_timeout_ms)
Helper function to create a RetryRunner with table commit configuration.
Definition retry_util.h:202
ErrorKind
Error types for iceberg.
Definition result.h:36
Define Result, Status, and error helpers.
Configuration for retry behavior.
Definition retry_util.h:46
int32_t num_retries
Maximum number of retry attempts (not including the first attempt)
Definition retry_util.h:48
Definition retry_util.h:94