瀏覽代碼

Chord: Never call callback more than once

Conflicts:
	celery/backends/redis.py
Ask Solem 10 年之前
父節點
當前提交
e899596150
共有 2 個文件被更改,包括 6 次插入2 次删除
  1. 5 1
      celery/backends/base.py
  2. 1 1
      celery/backends/redis.py

+ 5 - 1
celery/backends/base.py

@@ -544,7 +544,11 @@ class KeyValueStoreBackend(BaseBackend):
                     ChordError('GroupResult {0} no longer exists'.format(gid)),
                     ChordError('GroupResult {0} no longer exists'.format(gid)),
                 )
                 )
         val = self.incr(key)
         val = self.incr(key)
-        if val >= len(deps):
+        size = len(deps)
+        if val > size:
+            logger.warning('Chord counter incremented too many times for %r',
+                           gid)
+        elif val == size:
             callback = maybe_signature(task.request.chord, app=app)
             callback = maybe_signature(task.request.chord, app=app)
             j = deps.join_native if deps.supports_native_join else deps.join
             j = deps.join_native if deps.supports_native_join else deps.join
             try:
             try:

+ 1 - 1
celery/backends/redis.py

@@ -211,7 +211,7 @@ class RedisBackend(KeyValueStoreBackend):
         try:
         try:
             callback = maybe_signature(request.chord, app=app)
             callback = maybe_signature(request.chord, app=app)
             total = callback['chord_size']
             total = callback['chord_size']
-            if readycount >= total:
+            if readycount == total:
                 decode, unpack = self.decode, self._unpack_chord_result
                 decode, unpack = self.decode, self._unpack_chord_result
                 resl, _ = client.pipeline()     \
                 resl, _ = client.pipeline()     \
                     .lrange(jkey, 0, total)     \
                     .lrange(jkey, 0, total)     \