瀏覽代碼

Better kvstore chord unlock error handling

Ask Solem 12 年之前
父節點
當前提交
bd956731d8
共有 1 個文件被更改,包括 18 次插入5 次删除
  1. 18 5
      celery/backends/base.py

+ 18 - 5
celery/backends/base.py

@@ -428,6 +428,7 @@ class KeyValueStoreBackend(BaseBackend):
             return
         from celery import subtask
         from celery.result import GroupResult
+        app = self.app
         if propagate is None:
             propagate = self.app.conf.CELERY_CHORD_PROPAGATES
         gid = task.request.group
@@ -442,13 +443,25 @@ class KeyValueStoreBackend(BaseBackend):
             try:
                 ret = j(propagate=propagate)
             except Exception as exc:
-                culprit = next(deps._failed_join_report())
-                self.app._tasks[callback.task].backend.fail_from_current_stack(
-                    callback.id, exc=ChordError('Dependency %s raised %r' % (
-                        culprit.id, exc))
+                try:
+                    culprit = next(deps._failed_join_report())
+                    reason = 'Dependency {0.id} raised {1!r}'.format(
+                        culprit, exc,
+                    )
+                except StopIteration:
+                    reason = repr(exc)
+
+                app._tasks[callback.task].backend.fail_from_current_stack(
+                    callback.id, exc=ChordError(reason),
                 )
             else:
-                callback.delay(ret)
+                try:
+                    callback.delay(ret)
+                except Exception as exc:
+                    app._tasks[callback.task].backend.fail_from_current_stack(
+                        callback.id,
+                        exc=ChordError('Callback error: {0!r}'.format(exc)),
+                    )
             finally:
                 deps.delete()
                 self.client.delete(key)