fix(activity): record external.* TaskRun.queue as download, not default (#883)
celery_signals._queue_for is a hand-maintained mirror of task_routes that stamps TaskRun.queue in the prerun signal. It was missing the backend.app.tasks.external. prefix, so external fetches recorded queue='default' even though celery routes external.* → download and runs them on the download worker. The dashboard's per-queue filters and the per-queue recovery-sweep threshold therefore missed them — the same 'queue column lies default' gap the 2026-06-02 audit fixed for backup/admin/library_audit. Map external.* → download in _queue_for. Composes with the fetch_external_link task-name sweep override (#883), which wins by precedence regardless of the recorded queue. Pinned test asserts the mirror agrees with the actual route. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -69,7 +69,15 @@ def _queue_for(task) -> str:
|
|||||||
return "ml"
|
return "ml"
|
||||||
if name.startswith("backend.app.tasks.thumbnail."):
|
if name.startswith("backend.app.tasks.thumbnail."):
|
||||||
return "thumbnail"
|
return "thumbnail"
|
||||||
if name.startswith("backend.app.tasks.download."):
|
if name.startswith((
|
||||||
|
"backend.app.tasks.download.",
|
||||||
|
# External file-host fetches share the download lane (celery_app
|
||||||
|
# routes external.* → download). Mirror it here or TaskRun.queue
|
||||||
|
# lies 'default' for them, so per-queue dashboard filters and the
|
||||||
|
# per-queue threshold override miss them — the same gap the
|
||||||
|
# 2026-06-02 audit fixed for backup/admin/library_audit.
|
||||||
|
"backend.app.tasks.external.",
|
||||||
|
)):
|
||||||
return "download"
|
return "download"
|
||||||
if name.startswith("backend.app.tasks.scan."):
|
if name.startswith("backend.app.tasks.scan."):
|
||||||
return "scan"
|
return "scan"
|
||||||
|
|||||||
@@ -18,3 +18,21 @@ def test_long_one_shots_route_to_maintenance_long():
|
|||||||
def test_quick_maintenance_stays_on_maintenance():
|
def test_quick_maintenance_stays_on_maintenance():
|
||||||
routes = celery.conf.task_routes
|
routes = celery.conf.task_routes
|
||||||
assert routes["backend.app.tasks.maintenance.*"]["queue"] == "maintenance"
|
assert routes["backend.app.tasks.maintenance.*"]["queue"] == "maintenance"
|
||||||
|
|
||||||
|
|
||||||
|
def test_queue_for_mirrors_external_to_download():
|
||||||
|
"""celery_signals._queue_for is a hand-maintained mirror of task_routes
|
||||||
|
that stamps TaskRun.queue. external.* routes to the download lane, so the
|
||||||
|
mirror must agree — else TaskRun.queue lies 'default' for external fetches
|
||||||
|
and per-queue dashboard filters / threshold overrides miss them
|
||||||
|
(operator-flagged 2026-06-17)."""
|
||||||
|
from backend.app.celery_signals import _queue_for
|
||||||
|
|
||||||
|
class _T:
|
||||||
|
name = "backend.app.tasks.external.fetch_external_link"
|
||||||
|
|
||||||
|
assert _queue_for(_T()) == "download"
|
||||||
|
assert (
|
||||||
|
celery.conf.task_routes["backend.app.tasks.external.*"]["queue"]
|
||||||
|
== "download"
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user