def release(
self,
session_id: str,
status: SyncStatus,
result: DatabaseResult | None = None,
) -> None:
session = (
SyncSession.objects
.filter(id=session_id)
.first()
)
if session is None:
logger.warning(
'Sync session %s not found during release',
session_id,
)
return
now = timezone.now()
elapsed_ms = (now - session.started_at).total_seconds() * 1000
session.completed_at = now
session.duration_ms = int(elapsed_ms)
session.phase = (
SyncPhase.COMPLETE
if status == SyncStatus.SUCCESS
else SyncPhase.FAILED
)
session.status = status
if result is not None:
session.records_pushed = sum(
len(keys)
for keys in result.pushed.values()
)
session.records_applied = sum(
len(keys)
for keys in result.applied.values()
)
session.records_created = sum(
len(keys)
for keys in result.created.values()
)
session.records_deleted = sum(
len(keys)
for keys in result.deleted.values()
)
session.conflicts = sum(
len(keys)
for keys in result.conflicts.values()
)
session.errors = len(result.errors)
session.save()
logger.info(
'Released sync lock for session %s (status=%s)',
session_id,
status,
)