WeaviateEx.Retry (WeaviateEx v0.7.4)
View SourceRetry logic with exponential backoff for Weaviate operations.
Automatically retries operations that fail with transient errors (rate limits, service unavailable, timeouts) using exponential backoff with jitter.
Examples
Retry.with_exponential_backoff(fn ->
WeaviateEx.Client.request(client, :post, "/v1/objects", object)
end)
Retry.with_exponential_backoff(
fn -> expensive_operation() end,
max_retries: 5,
base_delay: 200,
max_delay: 10_000
)
Summary
Functions
Calculate delay for retry attempt with jitter.
Check if a gRPC status code is retryable.
Check if an error is retryable.
Execute function with exponential backoff retry.
Types
@type retry_opts() :: [ max_retries: pos_integer(), base_delay: pos_integer(), max_delay: pos_integer() ]
Functions
@spec calculate_delay(non_neg_integer(), pos_integer(), pos_integer()) :: pos_integer()
Calculate delay for retry attempt with jitter.
Uses exponential backoff: base_delay * 2^attempt with +/- 10% jitter,
capped at max_delay.
Examples
Retry.calculate_delay(0, 100, 5000)
# => ~100 (with jitter)
Retry.calculate_delay(3, 100, 5000)
# => ~800 (with jitter)
Check if a gRPC status code is retryable.
Examples
Retry.grpc_retryable?(:unavailable)
# => true
Retry.grpc_retryable?(:not_found)
# => false
Retry.grpc_retryable?(14)
# => true
Check if an error is retryable.
Retryable errors include:
- HTTP 429 (Rate Limited)
- HTTP 502 (Bad Gateway)
- HTTP 503 (Service Unavailable)
- HTTP 504 (Gateway Timeout)
- gRPC UNAVAILABLE (14)
- gRPC RESOURCE_EXHAUSTED (8)
- gRPC ABORTED (10)
- gRPC DEADLINE_EXCEEDED (4)
- Connection errors (timeout, connection refused, etc.)
Examples
Retry.retryable?(%{status: 429})
# => true
Retry.retryable?(%{status: 400})
# => false
Retry.retryable?(%{reason: :timeout})
# => true
Retry.retryable?(%GRPC.RPCError{status: 14})
# => true
@spec with_exponential_backoff((-> {:ok, term()} | {:error, term()}), retry_opts()) :: {:ok, term()} | {:error, term()}
Execute function with exponential backoff retry.
Options
:max_retries- Maximum retry attempts (default: 3):base_delay- Initial delay in milliseconds (default: 100):max_delay- Maximum delay cap in milliseconds (default: 5000)
Examples
Retry.with_exponential_backoff(fn ->
{:ok, result}
end)
Retry.with_exponential_backoff(
fn -> risky_operation() end,
max_retries: 5,
base_delay: 200
)