@@ -0,0 +1,28 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
from functools import wraps
|
||||
from typing import Any, Callable, TypeVar
|
||||
|
||||
from sqlalchemy.exc import OperationalError
|
||||
|
||||
F = TypeVar("F", bound=Callable[..., Any])
|
||||
|
||||
|
||||
def retry_locked(fn: F, *, attempts: int = 3, delay: float = 0.15) -> F:
|
||||
@wraps(fn)
|
||||
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
||||
last_exc: Exception | None = None
|
||||
for i in range(attempts):
|
||||
try:
|
||||
return fn(*args, **kwargs)
|
||||
except OperationalError as exc:
|
||||
if "locked" not in str(exc).lower():
|
||||
raise
|
||||
last_exc = exc
|
||||
time.sleep(delay * (i + 1))
|
||||
if last_exc:
|
||||
raise last_exc
|
||||
return None
|
||||
|
||||
return wrapper # type: ignore[return-value]
|
||||
Reference in New Issue
Block a user