Release: dev → main (first public release) #258

Merged
bvandeusen merged 94 commits from dev into main 2026-09-25 10:02:40 -04:00
2 changed files with 21 additions and 0 deletions
Showing only changes of commit 058fa85606 - Show all commits
+7
View File
@@ -62,6 +62,13 @@ def make_celery() -> Celery:
# can never starve the quick self-healing sweeps (operator-flagged
# 2026-06-07: a 2h audit blocked vacuum/backup/normalize for hours).
"backend.app.tasks.maintenance.*": {"queue": "maintenance"},
# The one long job in maintenance.py: a whole-library phash
# recompute (35 min hard limit; the library was cleared for
# re-hashing by migration 0098). On the quick lane it held a
# scheduler process for its whole run, and the minute ticks queued
# up behind it (2026-09-24: 7 waiting, "all workers busy for 18
# minutes"). An exact name wins over the glob above.
"backend.app.tasks.maintenance.backfill_phash": {"queue": "maintenance_long"},
"backend.app.tasks.backup.*": {"queue": "maintenance_long"},
"backend.app.tasks.admin.*": {"queue": "maintenance_long"},
"backend.app.tasks.library_audit.*": {"queue": "maintenance_long"},
+14
View File
@@ -36,3 +36,17 @@ def test_queue_for_mirrors_external_to_download():
celery.conf.task_routes["backend.app.tasks.external.*"]["queue"]
== "download"
)
def test_backfill_phash_runs_on_the_long_lane():
"""It lives in maintenance.py, so the quick-lane glob matches it too —
the router must pick the exact name. A 35-minute rehash on the scheduler
lane blocked the minute ticks behind it (2026-09-24)."""
route = celery.amqp.router.route(
{}, "backend.app.tasks.maintenance.backfill_phash",
)
assert route["queue"].name == "maintenance_long"
quick = celery.amqp.router.route(
{}, "backend.app.tasks.maintenance.recover_stalled_task_runs",
)
assert quick["queue"].name == "maintenance"