Skip to content

Commit 054e688

Browse files
IdirLISNDidayolo
authored andcommitted
fixing synthax and format
1 parent 4212c17 commit 054e688

3 files changed

Lines changed: 67 additions & 25 deletions

File tree

src/apps/competitions/tasks.py

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
import re
44
import traceback
55
import zipfile
6+
import json
67
from datetime import timedelta, datetime
7-
8+
from django.conf import settings
89
from io import BytesIO
910
from tempfile import TemporaryDirectory, NamedTemporaryFile
1011

1112
import oyaml as yaml
1213
import requests
1314
from celery._state import app_or_default
14-
from django.conf import settings
15+
from django_redis import get_redis_connection
1516
from django.core.exceptions import ObjectDoesNotExist
1617
from django.core.files.base import ContentFile
1718
from django.db.models import Subquery, OuterRef, Count, Case, When, Value, F
@@ -42,9 +43,12 @@
4243
from asgiref.sync import async_to_sync
4344

4445
import logging
45-
4646
logger = logging.getLogger(__name__)
4747

48+
r = get_redis_connection("default")
49+
WORKERS_REGISTRY_KEY = "compute_workers_registry"
50+
WORKER_HEARTBEAT_TTL = 35
51+
4852
COMPETITION_FIELDS = [
4953
"title",
5054
"description",
@@ -914,36 +918,61 @@ def refresh_compute_worker_health():
914918
stats = inspector.stats() or {}
915919
active = inspector.active() or {}
916920
reserved = inspector.reserved() or {}
921+
active_queues = inspector.active_queues() or {}
917922
except Exception:
918923
logger.exception("Unable to inspect Celery workers")
919924
return
920925

921926
for worker_name in stats.keys():
922-
if not worker_name.startswith("compute-worker"):
927+
queues = active_queues.get(worker_name, []) or []
928+
queue_names = []
929+
930+
for q in queues:
931+
if isinstance(q, dict) and q.get("name"):
932+
queue_names.append(q["name"])
933+
934+
is_compute_worker = (
935+
"compute-worker" in queue_names
936+
or worker_name.startswith("compute-worker")
937+
or worker_name.startswith("CW")
938+
)
939+
940+
if not is_compute_worker:
923941
continue
924942

925-
raw_running_jobs = len(active.get(worker_name, [])) + len(
926-
reserved.get(worker_name, [])
943+
running_jobs = (
944+
len(active.get(worker_name, []))
945+
+ len(reserved.get(worker_name, []))
927946
)
928-
status = "busy" if raw_running_jobs > 0 else "available"
947+
status = "busy" if running_jobs > 0 else "available"
929948

930949
payload = {
931950
"hostname": worker_name,
932951
"status": status,
933-
"running_jobs": raw_running_jobs,
952+
"running_jobs": running_jobs,
934953
"timestamp": now().timestamp(),
935954
}
936955

937-
r.set(f"worker:{worker_name}:heartbeat", json.dumps(payload), ex=35)
956+
heartbeat_key = f"worker:{worker_name}:heartbeat"
957+
958+
r.set(
959+
heartbeat_key,
960+
json.dumps(payload),
961+
ex=WORKER_HEARTBEAT_TTL,
962+
)
963+
938964
r.hset(
939965
WORKERS_REGISTRY_KEY,
940966
worker_name,
941-
json.dumps(
942-
{
943-
"hostname": worker_name,
944-
"last_seen": payload["timestamp"],
945-
}
946-
),
967+
json.dumps({
968+
"hostname": worker_name,
969+
"status": status,
970+
"running_jobs": running_jobs,
971+
"last_seen": payload["timestamp"],
972+
}),
947973
)
948974

949975
_broadcast_worker_state(payload)
976+
logger.info(
977+
f"[WORKER-HEALTH] {worker_name} status={status} jobs={running_jobs}"
978+
)

src/celery_config.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@ def app_for_vhost(vhost):
4242
_vhost_apps[vhost] = vhost_app
4343
return _vhost_apps[vhost]
4444

45-
4645
app.conf.beat_schedule = {
4746
"refresh-compute-worker-health": {
48-
"task": "chemin.vers.refresh_compute_worker_health",
49-
"schedule": 5.0,
47+
"task": "apps.competitions.tasks.refresh_compute_worker_health",
48+
"schedule": 3.0,
5049
},
51-
}
50+
}

src/utils/consumers.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,33 @@
55
from channels.generic.websocket import AsyncJsonWebsocketConsumer
66
from celery._state import app_or_default
77

8+
import logging
9+
10+
logger = logging.getLogger(__name__)
11+
812

913
class ComputeWorkersConsumer(AsyncJsonWebsocketConsumer):
1014
async def connect(self):
11-
user = self.scope["user"]
15+
user = self.scope.get("user")
1216

1317
if user is None or user.is_anonymous:
1418
await self.close()
1519
return
20+
1621
await self.accept()
1722
self._running = True
1823
self._task = asyncio.create_task(self._push_workers_loop())
1924

2025
async def disconnect(self, close_code):
2126
self._running = False
22-
if hasattr(self, "_task"):
23-
self._task.cancel()
27+
28+
task = getattr(self, "_task", None)
29+
if task:
30+
task.cancel()
31+
try:
32+
await task
33+
except asyncio.CancelledError:
34+
pass
2435

2536
async def _push_workers_loop(self):
2637
while self._running:
@@ -46,13 +57,15 @@ def _load_snapshot(self):
4657
reserved = inspector.reserved() or {}
4758
active_queues = inspector.active_queues() or {}
4859
except Exception:
60+
logger.exception("Unable to inspect Celery workers")
4961
return []
5062

5163
workers = []
5264

5365
for worker_name in stats.keys():
5466
queues = active_queues.get(worker_name, []) or []
5567
queue_names = []
68+
5669
for q in queues:
5770
if isinstance(q, dict) and q.get("name"):
5871
queue_names.append(q["name"])
@@ -66,8 +79,9 @@ def _load_snapshot(self):
6679
if not is_compute_worker:
6780
continue
6881

69-
running_jobs = len(active.get(worker_name, [])) + len(
70-
reserved.get(worker_name, [])
82+
running_jobs = (
83+
len(active.get(worker_name, []))
84+
+ len(reserved.get(worker_name, []))
7185
)
7286
status = "busy" if running_jobs > 0 else "available"
7387

@@ -80,4 +94,4 @@ def _load_snapshot(self):
8094
}
8195
)
8296

83-
return workers
97+
return workers

0 commit comments

Comments
 (0)