fix(fc3i): single-line celery.signals import + INT32 bounds on target_id + dict.fromkeys + rewrite retry test as direct _finalize unit
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -22,9 +22,7 @@ import logging
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from celery.exceptions import SoftTimeLimitExceeded
|
||||
from celery.signals import (
|
||||
task_failure, task_postrun, task_prerun, task_retry,
|
||||
)
|
||||
from celery.signals import task_failure, task_postrun, task_prerun, task_retry
|
||||
|
||||
from .models import TaskRun
|
||||
from .tasks._sync_engine import sync_session_factory
|
||||
@@ -44,6 +42,15 @@ _MAX_ERROR_MESSAGE_LEN = 2000
|
||||
_MAX_ARGS_SUMMARY_LEN = 255
|
||||
_MAX_WORKER_HOSTNAME_LEN = 128
|
||||
|
||||
# PostgreSQL Integer is signed 32-bit. Tasks called with a first-arg
|
||||
# int outside this range (e.g. an absurdly large mock value, or a
|
||||
# string-of-digits coercible to int but bigger than 2^31-1) would crash
|
||||
# the INSERT with NumericValueOutOfRange. Bound the recorded value to
|
||||
# the column's range; values outside become None (target_id is
|
||||
# nullable, so this is safe).
|
||||
_INT32_MAX = 2_147_483_647
|
||||
_INT32_MIN = -2_147_483_648
|
||||
|
||||
|
||||
def _queue_for(task) -> str:
|
||||
"""Reverse the task→queue routing from celery_app.task_routes.
|
||||
@@ -68,14 +75,18 @@ def _queue_for(task) -> str:
|
||||
|
||||
|
||||
def _target_id_from_args(args) -> int | None:
|
||||
"""Best-effort: if the first positional arg parses as int, record
|
||||
it as target_id (image_id, source_id, etc.). Never raises."""
|
||||
"""Best-effort: if the first positional arg parses as int AND fits
|
||||
in the column's signed-32-bit range, record it as target_id
|
||||
(image_id, source_id, etc.). Never raises."""
|
||||
if not args:
|
||||
return None
|
||||
try:
|
||||
return int(args[0])
|
||||
value = int(args[0])
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
if value < _INT32_MIN or value > _INT32_MAX:
|
||||
return None
|
||||
return value
|
||||
|
||||
|
||||
def _truncate(s, limit: int) -> str | None:
|
||||
|
||||
Reference in New Issue
Block a user