Explorar o código

KeyValueStoreBackend.get_many must respect timeout. Closes #512. Thanks to lbucket

Ask Solem %!s(int64=13) %!d(string=hai) anos
pai
achega
f5d3c1ef6f
Modificáronse 1 ficheiros con 4 adicións e 0 borrados
  1. 4 0
      celery/backends/base.py

+ 4 - 0
celery/backends/base.py

@@ -349,6 +349,7 @@ class KeyValueStoreBackend(BaseDictBackend):
                     cached_ids.add(task_id)
 
         ids ^= cached_ids
+        iterations = 0
         while ids:
             keys = list(ids)
             r = self._mget_to_results(self.mget([self.get_key_for_task(k)
@@ -357,7 +358,10 @@ class KeyValueStoreBackend(BaseDictBackend):
             ids ^= set(r.keys())
             for key, value in r.iteritems():
                 yield key, value
+            if timeout and iterations * interval >= timeout:
+                raise TimeoutError("Operation timed out (%s)" % (timeout, ))
             time.sleep(interval)  # don't busy loop.
+            iterations += 0
 
     def _forget(self, task_id):
         self.delete(self.get_key_for_task(task_id))