mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-25 16:56:22 +02:00
47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
|
|
"""Redis-based connector indexing locks to prevent duplicate sync tasks."""
|
||
|
|
|
||
|
|
import redis
|
||
|
|
|
||
|
|
from app.config import config
|
||
|
|
|
||
|
|
_redis_client: redis.Redis | None = None
|
||
|
|
LOCK_TTL_SECONDS = config.CONNECTOR_INDEXING_LOCK_TTL_SECONDS
|
||
|
|
|
||
|
|
|
||
|
|
def get_indexing_lock_redis_client() -> redis.Redis:
|
||
|
|
"""Get or create Redis client for connector indexing locks."""
|
||
|
|
global _redis_client
|
||
|
|
if _redis_client is None:
|
||
|
|
_redis_client = redis.from_url(config.REDIS_APP_URL, decode_responses=True)
|
||
|
|
return _redis_client
|
||
|
|
|
||
|
|
|
||
|
|
def _get_connector_lock_key(connector_id: int) -> str:
|
||
|
|
"""Generate Redis key for a connector indexing lock."""
|
||
|
|
return f"indexing:connector_lock:{connector_id}"
|
||
|
|
|
||
|
|
|
||
|
|
def acquire_connector_indexing_lock(connector_id: int) -> bool:
|
||
|
|
"""Acquire lock for connector indexing. Returns True if acquired."""
|
||
|
|
key = _get_connector_lock_key(connector_id)
|
||
|
|
return bool(
|
||
|
|
get_indexing_lock_redis_client().set(
|
||
|
|
key,
|
||
|
|
"1",
|
||
|
|
nx=True,
|
||
|
|
ex=LOCK_TTL_SECONDS,
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def release_connector_indexing_lock(connector_id: int) -> None:
|
||
|
|
"""Release lock for connector indexing."""
|
||
|
|
key = _get_connector_lock_key(connector_id)
|
||
|
|
get_indexing_lock_redis_client().delete(key)
|
||
|
|
|
||
|
|
|
||
|
|
def is_connector_indexing_locked(connector_id: int) -> bool:
|
||
|
|
"""Check if connector indexing lock exists."""
|
||
|
|
key = _get_connector_lock_key(connector_id)
|
||
|
|
return bool(get_indexing_lock_redis_client().exists(key))
|