WeaviateEx.GRPC.Retry (WeaviateEx v0.7.4)

View Source

Exponential 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

calculate_backoff(attempt)

@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)

retryable?(rpc_error)

@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)

retryable_status?(status)

@spec retryable_status?(integer()) :: boolean()

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

with_retry(fun, opts \\ [])

@spec with_retry(
  (-> result),
  keyword()
) :: result
when result: any()

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
)