WeaviateEx.Retry (WeaviateEx v0.7.4)

View Source

Retry 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

error()

@type error() :: map() | term()

retry_opts()

@type retry_opts() :: [
  max_retries: pos_integer(),
  base_delay: pos_integer(),
  max_delay: pos_integer()
]

Functions

calculate_delay(attempt, base_delay, max_delay)

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

grpc_retryable?(status)

@spec grpc_retryable?(atom() | integer()) :: boolean()

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

retryable?(arg1)

@spec retryable?(error()) :: boolean()

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

with_exponential_backoff(fun, opts \\ [])

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