#ifndef AWS_IO_CLIENT_RETRY_STRATEGY_H
#define AWS_IO_CLIENT_RETRY_STRATEGY_H
#include <aws/io/exports.h>
#include <aws/common/atomics.h>
#include <aws/common/byte_buf.h>
struct aws_retry_strategy;
struct aws_retry_token;
struct aws_event_loop_group;
typedef void(aws_retry_strategy_on_retry_token_acquired_fn)(
struct aws_retry_strategy *retry_strategy,
int error_code,
struct aws_retry_token *token,
void *user_data);
typedef void(aws_retry_strategy_on_retry_ready_fn)(struct aws_retry_token *token, int error_code, void *user_data);
enum aws_retry_error_type {
AWS_RETRY_ERROR_TYPE_TRANSIENT,
AWS_RETRY_ERROR_TYPE_THROTTLING,
AWS_RETRY_ERROR_TYPE_SERVER_ERROR,
AWS_RETRY_ERROR_TYPE_CLIENT_ERROR,
};
struct aws_retry_strategy_vtable {
void (*destroy)(struct aws_retry_strategy *retry_strategy);
int (*acquire_token)(
struct aws_retry_strategy *retry_strategy,
const struct aws_byte_cursor *partition_id,
aws_retry_strategy_on_retry_token_acquired_fn *on_acquired,
void *user_data,
uint64_t timeout_ms);
int (*schedule_retry)(
struct aws_retry_token *token,
enum aws_retry_error_type error_type,
aws_retry_strategy_on_retry_ready_fn *retry_ready,
void *user_data);
int (*record_success)(struct aws_retry_token *token);
void (*release_token)(struct aws_retry_token *token);
};
struct aws_retry_strategy {
struct aws_allocator *allocator;
struct aws_retry_strategy_vtable *vtable;
struct aws_atomic_var ref_count;
void *impl;
};
struct aws_retry_token {
struct aws_allocator *allocator;
struct aws_retry_strategy *retry_strategy;
struct aws_atomic_var ref_count;
void *impl;
};
enum aws_exponential_backoff_jitter_mode {
AWS_EXPONENTIAL_BACKOFF_JITTER_DEFAULT,
AWS_EXPONENTIAL_BACKOFF_JITTER_NONE,
AWS_EXPONENTIAL_BACKOFF_JITTER_FULL,
AWS_EXPONENTIAL_BACKOFF_JITTER_DECORRELATED,
};
struct aws_exponential_backoff_retry_options {
struct aws_event_loop_group *el_group;
size_t max_retries;
uint32_t backoff_scale_factor_ms;
enum aws_exponential_backoff_jitter_mode jitter_mode;
uint64_t (*generate_random)(void);
};
struct aws_standard_retry_options {
struct aws_exponential_backoff_retry_options backoff_retry_options;
size_t initial_bucket_capacity;
};
AWS_EXTERN_C_BEGIN
AWS_IO_API void aws_retry_strategy_acquire(struct aws_retry_strategy *retry_strategy);
AWS_IO_API void aws_retry_strategy_release(struct aws_retry_strategy *retry_strategy);
AWS_IO_API int aws_retry_strategy_acquire_retry_token(
struct aws_retry_strategy *retry_strategy,
const struct aws_byte_cursor *partition_id,
aws_retry_strategy_on_retry_token_acquired_fn *on_acquired,
void *user_data,
uint64_t timeout_ms);
AWS_IO_API int aws_retry_strategy_schedule_retry(
struct aws_retry_token *token,
enum aws_retry_error_type error_type,
aws_retry_strategy_on_retry_ready_fn *retry_ready,
void *user_data);
AWS_IO_API int aws_retry_token_record_success(struct aws_retry_token *token);
AWS_IO_API void aws_retry_token_acquire(struct aws_retry_token *token);
AWS_IO_API void aws_retry_token_release(struct aws_retry_token *token);
AWS_IO_API struct aws_retry_strategy *aws_retry_strategy_new_exponential_backoff(
struct aws_allocator *allocator,
const struct aws_exponential_backoff_retry_options *config);
AWS_IO_API struct aws_retry_strategy *aws_retry_strategy_new_standard(
struct aws_allocator *allocator,
const struct aws_standard_retry_options *config);
AWS_EXTERN_C_END
#endif