6ede33ccdb
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Has been cancelled
Build and Push Docker Images / finalize_release (push) Has been cancelled
Obsidian Plugin Lint / lint (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / compute_version (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / verify_digests (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Has been cancelled
37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
"""Retry policy enforcement for action handlers."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
from collections.abc import Awaitable, Callable
|
|
|
|
|
|
async def with_retries[T](
|
|
coro_factory: Callable[[], Awaitable[T]],
|
|
*,
|
|
max_retries: int,
|
|
backoff: str,
|
|
timeout: int | None,
|
|
) -> tuple[T, int]:
|
|
"""Call ``coro_factory`` up to ``1 + max_retries`` times. Return ``(result, attempts)``."""
|
|
total = 1 + max(0, max_retries)
|
|
for attempt in range(1, total + 1):
|
|
try:
|
|
coro = coro_factory()
|
|
if timeout is not None and timeout > 0:
|
|
return await asyncio.wait_for(coro, timeout=timeout), attempt
|
|
return await coro, attempt
|
|
except Exception:
|
|
if attempt >= total:
|
|
raise
|
|
await asyncio.sleep(_backoff_seconds(backoff, attempt))
|
|
raise RuntimeError("with_retries exhausted without raising or returning")
|
|
|
|
|
|
def _backoff_seconds(strategy: str, attempt: int) -> float:
|
|
if strategy == "exponential":
|
|
return float(2 ** (attempt - 1))
|
|
if strategy == "linear":
|
|
return float(attempt)
|
|
return 0.0
|