2026-07-18 20:34:22 +02:00
|
|
|
"""Live-sync entrypoint (refactor §2, step 3).
|
2026-07-17 23:20:34 +02:00
|
|
|
|
2026-07-18 20:34:22 +02:00
|
|
|
The sync worker's ``on_startup`` starts a :class:`SyncCoordinator`, which claims
|
|
|
|
|
accounts from the ``sync:live`` registry via Redis leases and runs one
|
|
|
|
|
:class:`~app.sync.runner.AccountRunner` per owned account. ``on_shutdown`` stops
|
|
|
|
|
it, releasing every lease so peers can take the accounts over immediately.
|
2026-07-17 23:20:34 +02:00
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
import logging
|
|
|
|
|
from typing import Any
|
|
|
|
|
|
2026-07-18 20:34:22 +02:00
|
|
|
from app.sync.coordinator import SyncCoordinator
|
2026-07-17 23:20:34 +02:00
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def start_supervisor(ctx: dict[str, Any]) -> None:
|
2026-07-18 20:34:22 +02:00
|
|
|
coordinator = SyncCoordinator()
|
|
|
|
|
await coordinator.start()
|
|
|
|
|
ctx["coordinator"] = coordinator
|
2026-07-17 23:20:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
async def stop_supervisor(ctx: dict[str, Any]) -> None:
|
2026-07-18 20:34:22 +02:00
|
|
|
coordinator: SyncCoordinator | None = ctx.get("coordinator")
|
|
|
|
|
if coordinator is not None:
|
|
|
|
|
await coordinator.stop()
|
|
|
|
|
ctx["coordinator"] = None
|