|
@@ -57,8 +57,8 @@ def add_unlock_chord_task(app):
|
|
|
default_propagate = app.conf.CELERY_CHORD_PROPAGATES
|
|
|
|
|
|
@app.task(name='celery.chord_unlock', max_retries=None, shared=False,
|
|
|
- default_retry_delay=1, ignore_result=True, lazy=False)
|
|
|
- def unlock_chord(group_id, callback, interval=None, propagate=None,
|
|
|
+ default_retry_delay=1, ignore_result=True, lazy=False, bind=True)
|
|
|
+ def unlock_chord(self, group_id, callback, interval=None, propagate=None,
|
|
|
max_retries=None, result=None,
|
|
|
Result=app.AsyncResult, GroupResult=app.GroupResult,
|
|
|
result_from_tuple=result_from_tuple):
|
|
@@ -69,45 +69,51 @@ def add_unlock_chord_task(app):
|
|
|
# exception set to ChordError.
|
|
|
propagate = default_propagate if propagate is None else propagate
|
|
|
if interval is None:
|
|
|
- interval = unlock_chord.default_retry_delay
|
|
|
+ interval = self.default_retry_delay
|
|
|
|
|
|
# check if the task group is ready, and if so apply the callback.
|
|
|
callback = maybe_signature(callback, app)
|
|
|
deps = GroupResult(
|
|
|
group_id,
|
|
|
[result_from_tuple(r, app=app) for r in result],
|
|
|
+ app=app,
|
|
|
)
|
|
|
j = deps.join_native if deps.supports_native_join else deps.join
|
|
|
|
|
|
- if deps.ready():
|
|
|
- callback = maybe_signature(callback, app=app)
|
|
|
+ try:
|
|
|
+ ready = deps.ready()
|
|
|
+ except Exception as exc:
|
|
|
+ raise self.retry(
|
|
|
+ exc=exc, countdown=interval, max_retries=max_retries,
|
|
|
+ )
|
|
|
+ else:
|
|
|
+ if not ready:
|
|
|
+ raise self.retry(countdown=interval, max_retries=max_retries)
|
|
|
+
|
|
|
+ callback = maybe_signature(callback, app=app)
|
|
|
+ try:
|
|
|
+ with allow_join_result():
|
|
|
+ ret = j(timeout=3.0, propagate=propagate)
|
|
|
+ except Exception as exc:
|
|
|
+ try:
|
|
|
+ culprit = next(deps._failed_join_report())
|
|
|
+ reason = 'Dependency {0.id} raised {1!r}'.format(
|
|
|
+ culprit, exc,
|
|
|
+ )
|
|
|
+ except StopIteration:
|
|
|
+ reason = repr(exc)
|
|
|
+ logger.error('Chord %r raised: %r', group_id, exc, exc_info=1)
|
|
|
+ app.backend.chord_error_from_stack(callback,
|
|
|
+ ChordError(reason))
|
|
|
+ else:
|
|
|
try:
|
|
|
- with allow_join_result():
|
|
|
- ret = j(timeout=3.0, propagate=propagate)
|
|
|
+ callback.delay(ret)
|
|
|
except Exception as exc:
|
|
|
- try:
|
|
|
- culprit = next(deps._failed_join_report())
|
|
|
- reason = 'Dependency {0.id} raised {1!r}'.format(
|
|
|
- culprit, exc,
|
|
|
- )
|
|
|
- except StopIteration:
|
|
|
- reason = repr(exc)
|
|
|
logger.error('Chord %r raised: %r', group_id, exc, exc_info=1)
|
|
|
- app.backend.chord_error_from_stack(callback,
|
|
|
- ChordError(reason))
|
|
|
- else:
|
|
|
- try:
|
|
|
- callback.delay(ret)
|
|
|
- except Exception as exc:
|
|
|
- logger.error('Chord %r raised: %r', group_id, exc,
|
|
|
- exc_info=1)
|
|
|
- app.backend.chord_error_from_stack(
|
|
|
- callback,
|
|
|
- exc=ChordError('Callback error: {0!r}'.format(exc)),
|
|
|
- )
|
|
|
- else:
|
|
|
- raise unlock_chord.retry(countdown=interval,
|
|
|
- max_retries=max_retries)
|
|
|
+ app.backend.chord_error_from_stack(
|
|
|
+ callback,
|
|
|
+ exc=ChordError('Callback error: {0!r}'.format(exc)),
|
|
|
+ )
|
|
|
return unlock_chord
|
|
|
|
|
|
|