Files
devplacepy/devplacepy/services/containers/activity.py
T
retoor 21f6ae0615
DevPlace CI / test (push) Failing after 1h2m3s
iUUUUpdatexz
2026-08-07 10:53:43 +02:00

57 lines
1.6 KiB
Python

# retoor <retoor@molodetz.nl>
from __future__ import annotations
import time
from datetime import datetime, timezone
from devplacepy.config import WORKSPACE_ACTIVITY_WRITE_SECONDS
from devplacepy.services.containers import store
_last_write: dict[str, float] = {}
_pending_egress: dict[str, int] = {}
_pending_requests: dict[str, int] = {}
def touch(instance_uid: str, egress_bytes: int = 0) -> None:
if not instance_uid:
return
if egress_bytes > 0:
_pending_egress[instance_uid] = _pending_egress.get(instance_uid, 0) + egress_bytes
_pending_requests[instance_uid] = _pending_requests.get(instance_uid, 0) + 1
now = time.monotonic()
if now - _last_write.get(instance_uid, 0.0) < WORKSPACE_ACTIVITY_WRITE_SECONDS:
return
_last_write[instance_uid] = now
flush(instance_uid)
def flush(instance_uid: str) -> None:
egress = _pending_egress.pop(instance_uid, 0)
requests = _pending_requests.pop(instance_uid, 0)
store.record_activity(
instance_uid,
datetime.now(timezone.utc).isoformat(),
egress,
requests,
)
def flush_all() -> None:
for instance_uid in list(_pending_requests) + list(_pending_egress):
if instance_uid in _pending_requests or instance_uid in _pending_egress:
flush(instance_uid)
def pending(instance_uid: str) -> tuple[int, int]:
return (
_pending_egress.get(instance_uid, 0),
_pending_requests.get(instance_uid, 0),
)
def forget(instance_uid: str) -> None:
_last_write.pop(instance_uid, None)
_pending_egress.pop(instance_uid, None)
_pending_requests.pop(instance_uid, None)