The Fix
pip install celery==5.5.1
Based on closed celery/celery issue #9651 · PR/commit linked
Production note: This usually shows up under retries/timeouts. Treat it as a side-effect risk until you can verify behavior with a canary + real traffic.
@@ -38,3 +38,4 @@ integration-tests-config.json
dump.rdb
.env
+junit.xml
diff --git a/celery/worker/consumer/delayed_delivery.py b/celery/worker/consumer/delayed_delivery.py
index d7cacd08068..7a39c60f090 100644
CELERY_ACCEPT_CONTENT: ['application/json']
CELERY_BROKER_URL: 'amqp://breww-rabbitmq:********@rabbitmq:5672//'
CELERY_CACHE_BACKEND: 'django-cache'
CELERY_RESULT_SERIALIZER: 'json'
CELERY_TASK_ACKS_LATE: True
CELERY_TASK_DEFAULT_PRIORITY: 5
CELERY_TASK_REJECT_ON_WORKER_LOST: True
CELERY_TASK_SERIALIZER: 'json'
CELERY_TIMEZONE: 'UTC'
CELERY_WORKER_PREFETCH_MULTIPLIER: 2
is_overridden: <bound method Settings.is_overridden of <Settings "goBrew.settings">>
deprecated_settings: None
task_default_queue: 'cq_normal'
task_default_queue_type: 'quorum'
task_queues: [<unbound Queue cq_urgent -> <unbound Exchange ''(direct)> -> >,
<unbound Queue cq_elasticsearch -> <unbound Exchange ''(direct)> -> >]
broker_transport_options:
'confirm_publish': True,
'health_check_interval': 5,
'queue_order_strategy': 'priority',
'redis_retry_on_timeout': True,
'retry_on_error': True,
'socket_keepalive': True}
broker_connection_retry_on_startup: True
broker_connection_retry: True
broker_channel_error_retry: True
Re-run the minimal reproduction on your broken version, then apply the fix and re-run.
Option A — Upgrade to fixed release\npip install celery==5.5.1\nWhen NOT to use: This fix should not be applied if the broker URLs are guaranteed to be strings.\n\n
Why This Fix Works in Production
- Trigger: [2025-04-02 10:00:04,411: INFO/MainProcess] Connected to amqp://breww-rabbitmq:**@rabbitmq:5672//
- Mechanism: The code attempted to call 'strip' on a list instead of a string
- Why the fix works: Fixed an AttributeError when using a list of broker URLs with quorum queues. (first fixed release: 5.5.1).
- If left unfixed, the same config can fail only in production (env differences), causing startup failures or partial feature outages.
Why This Breaks in Prod
- Shows up under Python 3.13 in real deployments (not just unit tests).
- The code attempted to call 'strip' on a list instead of a string
- Surfaces as: [2025-04-02 10:00:04,411: INFO/MainProcess] Connected to amqp://breww-rabbitmq:**@rabbitmq:5672//
Proof / Evidence
- GitHub issue: #9651
- Fix PR: https://github.com/celery/celery/pull/9657
- First fixed release: 5.5.1
- Reproduced locally: No (not executed)
- Last verified: 2026-02-09
- Confidence: 0.95
- Did this fix it?: Yes (upstream fix exists)
- Own content ratio: 0.27
Discussion
High-signal excerpts from the issue thread (symptoms, repros, edge-cases).
“Thank you for fixing so promptly :pray: And all the work that has gone into 5.5.0 :boom:”
“> Thank you for fixing so promptly 🙏 And all the work that has gone into 5.5.0 💥 Thank you for reporting! This is a…”
“@violuke if you want you can give main a shot and report here, or open a new ticket if you see anything else, and I’ll…”
“Thank you. I can confirm this seems to be working. Just deployed to production so will follow up if anything else comes to light :+1:”
Failure Signature (Search String)
- [2025-04-02 10:00:04,411: INFO/MainProcess] Connected to amqp://breww-rabbitmq:**@rabbitmq:5672//
Error Message
Stack trace
Error Message
-------------
[2025-04-02 10:00:04,411: INFO/MainProcess] Connected to amqp://breww-rabbitmq:**@rabbitmq:5672//
[2025-04-02 10:00:04,415: INFO/MainProcess] mingle: searching for neighbors
[2025-04-02 10:00:05,440: INFO/MainProcess] mingle: all alone
[2025-04-02 10:00:05,456: INFO/MainProcess] Global QoS is disabled. Prefetch count in now static.
[2025-04-02 10:00:05,461: CRITICAL/MainProcess] Unrecoverable error: AttributeError("'list' object has no attribute 'strip'")
Traceback (most recent call last):
File "/app/.venv/lib/python3.13/site-packages/celery/worker/worker.py", line 203, in start
self.blueprint.start(self)
~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/app/.venv/lib/python3.13/site-packages/celery/bootsteps.py", line 116, in start
step.start(parent)
~~~~~~~~~~^^^^^^^^
File "/app/.venv/lib/python3.13/site-packages/celery/bootsteps.py", line 365, in start
return self.obj.start()
~~~~~~~~~~~~~~^^
File "/app/.venv/lib/python3.13/site-packages/celery/worker/consumer/consumer.py", line 341, in start
blueprint.start(self)
~~~~~~~~~~~~~~~^^^^^^
File "/app/.venv/lib/python3.13/site-packages/celery/bootsteps.py", line 116, in start
step.start(parent)
~~~~~~~~~~^^^^^^^^
File "/app/.venv/lib/python3.13/site-packages/celery/worker/consumer/delayed_delivery.py", line 74, in start
self._validate_configuration(app)
~~~~~~~~~~~~~~~~~~~~~~~~~~
... (truncated) ...
Minimal Reproduction
CELERY_ACCEPT_CONTENT: ['application/json']
CELERY_BROKER_URL: 'amqp://breww-rabbitmq:********@rabbitmq:5672//'
CELERY_CACHE_BACKEND: 'django-cache'
CELERY_RESULT_SERIALIZER: 'json'
CELERY_TASK_ACKS_LATE: True
CELERY_TASK_DEFAULT_PRIORITY: 5
CELERY_TASK_REJECT_ON_WORKER_LOST: True
CELERY_TASK_SERIALIZER: 'json'
CELERY_TIMEZONE: 'UTC'
CELERY_WORKER_PREFETCH_MULTIPLIER: 2
is_overridden: <bound method Settings.is_overridden of <Settings "goBrew.settings">>
deprecated_settings: None
task_default_queue: 'cq_normal'
task_default_queue_type: 'quorum'
task_queues: [<unbound Queue cq_urgent -> <unbound Exchange ''(direct)> -> >,
<unbound Queue cq_elasticsearch -> <unbound Exchange ''(direct)> -> >]
broker_transport_options:
'confirm_publish': True,
'health_check_interval': 5,
'queue_order_strategy': 'priority',
'redis_retry_on_timeout': True,
'retry_on_error': True,
'socket_keepalive': True}
broker_connection_retry_on_startup: True
broker_connection_retry: True
broker_channel_error_retry: True
Environment
- Python: 3.13
What Broke
Users experienced crashes when using a list of broker URLs with quorum queues.
Why It Broke
The code attempted to call 'strip' on a list instead of a string
Fix Options (Details)
Option A — Upgrade to fixed release Safe default (recommended)
pip install celery==5.5.1
Use when you can deploy the upstream fix. It is usually lower-risk than long-lived workarounds.
Fix reference: https://github.com/celery/celery/pull/9657
First fixed release: 5.5.1
Last verified: 2026-02-09. Validate in your environment.
When NOT to Use This Fix
- This fix should not be applied if the broker URLs are guaranteed to be strings.
Verify Fix
Re-run the minimal reproduction on your broken version, then apply the fix and re-run.
Did This Fix Work in Your Case?
Quick signal helps us prioritize which fixes to verify and improve.
Prevention
- Track RSS + object counts after deployments; alert on monotonic growth and GC pressure.
- Add a long-running test that repeats the failing call path and asserts stable memory.
Version Compatibility Table
| Version | Status |
|---|---|
| 5.5.1 | Fixed |
Related Issues
No related fixes found.
Sources
We don’t republish the full GitHub discussion text. Use the links above for context.