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::kNoRetry ||
sizeof...(Kinds) > 0,
98 "RetryPolicy 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) || ...);
123inline constexpr bool kIsRetryPolicy =
false;
125template <RetryPolicyMode Mode,
ErrorKind... Kinds>
126inline constexpr bool kIsRetryPolicy<
RetryPolicy<Mode, Kinds...>> =
true;
129concept Policy = kIsRetryPolicy<std::remove_cvref_t<T>>;
137template <retry::Policy RetryPolicy>
142 : detail::RetryRunnerBase(
std::move(config)) {}
149 template <detail::RetryTask F>
150 auto Run(F&& task, int32_t* attempt_counter =
nullptr)
151 -> std::remove_cvref_t<std::invoke_result_t<F&>> {
152 ICEBERG_RETURN_UNEXPECTED(ValidatePolicyConfig());
154 const auto deadline = this->ComputeDeadline();
156 const int32_t max_attempts = this->config_.num_retries + 1;
160 if (attempt_counter !=
nullptr) {
161 *attempt_counter = attempt;
164 auto result = std::invoke(task);
165 if (result.has_value()) {
169 if (!CanRetry(result.error().kind, attempt, max_attempts, deadline)) {
173 if (!this->WaitForNextAttempt(attempt, deadline)) {
180 using TimePoint = detail::RetryRunnerBase::TimePoint;
182 Status ValidatePolicyConfig()
const {
184 if (!validation.has_value()) {
187 if (this->config_.num_retries > 0 && !RetryPolicy::kEnabled) {
188 return InvalidArgument(
"Retry policy must be enabled when num_retries > 0");
193 bool CanRetry(
ErrorKind kind, int32_t attempt, int32_t max_attempts,
194 const std::optional<TimePoint>& deadline)
const {
195 return attempt < max_attempts && !this->HasTimedOut(deadline) &&
196 RetryPolicy::ShouldRetry(kind);
203 int32_t total_timeout_ms) {
205 ErrorKind::kRetryableValidationFailed>>(
207 .min_wait_ms = min_wait_ms,
208 .max_wait_ms = max_wait_ms,
209 .total_timeout_ms = total_timeout_ms});
Utility class for running tasks with retry logic.
Definition retry_util.h:138
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:150
RetryRunner(RetryConfig config={})
Construct a RetryRunner with the given configuration.
Definition retry_util.h:141
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 retry_util.h:41
Definition retry_util.h:129
Define symbol visibility macros for core Iceberg APIs.
Define common Iceberg utility macros.
Core Apache Iceberg C++ APIs.
Definition arrow_io_util.h:33
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:201
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