Browse Source

Fixes problem with unpickleable exceptions. Closes celery/billiard#12

Ask Solem 12 years ago
parent
commit
e3382f5dde
3 changed files with 7 additions and 9 deletions
  1. 2 1
      celery/backends/base.py
  2. 2 7
      celery/utils/serialization.py
  3. 3 1
      celery/worker/job.py

+ 2 - 1
celery/backends/base.py

@@ -252,7 +252,8 @@ class BaseDictBackend(BaseBackend):
     def store_result(self, task_id, result, status, traceback=None, **kwargs):
     def store_result(self, task_id, result, status, traceback=None, **kwargs):
         """Store task result and status."""
         """Store task result and status."""
         result = self.encode_result(result, status)
         result = self.encode_result(result, status)
-        return self._store_result(task_id, result, status, traceback, **kwargs)
+        self._store_result(task_id, result, status, traceback, **kwargs)
+        return result
 
 
     def forget(self, task_id):
     def forget(self, task_id):
         self._cache.pop(task_id, None)
         self._cache.pop(task_id, None)

+ 2 - 7
celery/utils/serialization.py

@@ -84,7 +84,7 @@ def find_nearest_pickleable_exception(exc):
         try:
         try:
             exc_args = getattr(exc, 'args', [])
             exc_args = getattr(exc, 'args', [])
             superexc = supercls(*exc_args)
             superexc = supercls(*exc_args)
-            pickle.dumps(superexc)
+            pickle.loads(pickle.dumps(superexc))
         except:
         except:
             pass
             pass
         else:
         else:
@@ -162,12 +162,7 @@ def get_pickleable_exception(exc):
     nearest = find_nearest_pickleable_exception(exc)
     nearest = find_nearest_pickleable_exception(exc)
     if nearest:
     if nearest:
         return nearest
         return nearest
-
-    try:
-        pickle.dumps(exc)
-    except Exception:
-        return UnpickleableExceptionWrapper.from_exception(exc)
-    return exc
+    return UnpickleableExceptionWrapper.from_exception(exc)
 
 
 
 
 def get_pickled_exception(exc):
 def get_pickled_exception(exc):

+ 3 - 1
celery/worker/job.py

@@ -32,6 +32,7 @@ from celery.task.trace import (
 from celery.utils import fun_takes_kwargs
 from celery.utils import fun_takes_kwargs
 from celery.utils.functional import noop
 from celery.utils.functional import noop
 from celery.utils.log import get_logger
 from celery.utils.log import get_logger
+from celery.utils.serialization import get_pickled_exception
 from celery.utils.text import truncate
 from celery.utils.text import truncate
 from celery.utils.timeutils import maybe_iso8601, timezone
 from celery.utils.timeutils import maybe_iso8601, timezone
 
 
@@ -361,8 +362,9 @@ class Request(object):
         self._log_error(exc_info)
         self._log_error(exc_info)
 
 
     def _log_error(self, einfo):
     def _log_error(self, einfo):
+        einfo.exception = get_pickled_exception(einfo.exception)
         exception, traceback, exc_info, internal, sargs, skwargs = (
         exception, traceback, exc_info, internal, sargs, skwargs = (
-            safe_repr(einfo.exception),
+            einfo.exception,
             safe_str(einfo.traceback),
             safe_str(einfo.traceback),
             einfo.exc_info,
             einfo.exc_info,
             einfo.internal,
             einfo.internal,