WeaviateEx.GRPC.Retry (WeaviateEx v0.7.4)
View SourceExponential backoff retry mechanism for gRPC calls.
Automatically retries gRPC calls that fail with transient errors:
- UNAVAILABLE (14)
- RESOURCE_EXHAUSTED (8)
- ABORTED (10)
- DEADLINE_EXCEEDED (4)
Usage
alias WeaviateEx.GRPC.Retry
result = Retry.with_retry(fn ->
WeaviateStub.search(channel, request, opts)
end)Options
:max_retries- Maximum number of retry attempts (default: 4):base_delay_ms- Base delay in milliseconds for backoff calculation (default: 1000)
Backoff Strategy
Uses exponential backoff: min(2^attempt * base_delay_ms, 32000) milliseconds.
Attempt 0: 1 second Attempt 1: 2 seconds Attempt 2: 4 seconds Attempt 3: 8 seconds Attempt 4+: 32 seconds (capped)
Summary
Functions
Calculate exponential backoff delay for a given attempt number.
Check if a gRPC error is retryable.
Check if a gRPC status code is retryable.
Execute a function with automatic retry on transient gRPC errors.
Functions
@spec calculate_backoff(non_neg_integer()) :: non_neg_integer()
Calculate exponential backoff delay for a given attempt number.
Returns delay in milliseconds, capped at 32 seconds.
Examples
Retry.calculate_backoff(0) # => 1000 (1 second)
Retry.calculate_backoff(1) # => 2000 (2 seconds)
Retry.calculate_backoff(2) # => 4000 (4 seconds)
Retry.calculate_backoff(5) # => 32000 (32 seconds, capped)
@spec retryable?(GRPC.RPCError.t()) :: boolean()
Check if a gRPC error is retryable.
Examples
Retry.retryable?(%GRPC.RPCError{status: 14}) # => true (unavailable)
Retry.retryable?(%GRPC.RPCError{status: 3}) # => false (invalid argument)
Check if a gRPC status code is retryable.
Retryable status codes:
- 4: DEADLINE_EXCEEDED
- 8: RESOURCE_EXHAUSTED
- 10: ABORTED
- 14: UNAVAILABLE
Examples
Retry.retryable_status?(14) # => true
Retry.retryable_status?(3) # => false
Execute a function with automatic retry on transient gRPC errors.
Options
:max_retries- Maximum retry attempts (default: 4):base_delay_ms- Base delay for exponential backoff (default: 1000)
Examples
Retry.with_retry(fn ->
WeaviateStub.search(channel, request, opts)
end)
Retry.with_retry(
fn -> WeaviateStub.search(channel, request, opts) end,
max_retries: 3
)