Sfoglia il codice sorgente

Don't return unpickleable exceptions from Pool worker.

Ask Solem 15 anni fa
parent
commit
aba1989a95
3 ha cambiato i file con 6 aggiunte e 3 eliminazioni
  1. 1 0
      celery/backends/base.py
  2. 2 1
      celery/backends/database.py
  3. 3 2
      celery/worker/job.py

+ 1 - 0
celery/backends/base.py

@@ -221,6 +221,7 @@ class KeyValueStoreBackend(BaseBackend):
             result = self.prepare_exception(result)
         meta = {"status": status, "result": result}
         self.set(self.get_cache_key_for_task(task_id), pickle.dumps(meta))
+        return result
 
     def get_status(self, task_id):
         """Get the status of a task."""

+ 2 - 1
celery/backends/database.py

@@ -24,7 +24,8 @@ class Backend(BaseBackend):
             result = self.prepare_result(result)
         elif status == "FAILURE":
             result = self.prepare_exception(result)
-        return TaskMeta.objects.store_result(task_id, result, status)
+        TaskMeta.objects.store_result(task_id, result, status)
+        return result
 
     def is_done(self, task_id):
         """Returns ``True`` if task with ``task_id`` has been executed."""

+ 3 - 2
celery/worker/job.py

@@ -85,8 +85,9 @@ def jail(task_id, task_name, func, args, kwargs):
     except (SystemExit, KeyboardInterrupt):
         raise
     except Exception, exc:
-        default_backend.mark_as_failure(task_id, exc)
-        retval = ExceptionInfo(sys.exc_info())
+        stored_exc = default_backend.mark_as_failure(task_id, exc)
+        type_, _, tb = sys.exc_info()
+        retval = ExceptionInfo((type_, stored_exc, tb)
     else:
         if not ignore_result:
             default_backend.mark_as_done(task_id, result)