From 7a91b3644bd175ad66bbd205adff62e6d60912ad Mon Sep 17 00:00:00 2001 From: Dillon Dixon Date: Wed, 18 May 2016 12:22:59 -0700 Subject: [PATCH 1/5] Added a task decorator for QWorkerd plugins --- qworkerd/main.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/qworkerd/main.py b/qworkerd/main.py index 9960bae..b50c624 100644 --- a/qworkerd/main.py +++ b/qworkerd/main.py @@ -1,6 +1,7 @@ #! /usr/bin/env python from __future__ import absolute_import +from functools import wraps import django, logging, logtool, os, psutil import raven, raven.contrib.celery, raven.transport.http, socket, sys from celery import Celery @@ -13,6 +14,9 @@ __version__ = get_versions ()['version'] del get_versions +class BadConfigurationError(Exception): + pass + LOG = logging.getLogger (__name__) DEFAULT_LOGCONF = "/etc/qworkerd/logging.conf" @@ -41,6 +45,37 @@ def _settings_value (sets, key, default): return getattr (sets, key) return getattr (settings, key, default) +@logtool.log_call +def qworkerd_task (base = QWTask, retry_on = (), no_retry_on = (), + local_settings = None): + """Method decorator for QWorkerd plugins""" + if retry_on and no_retry_on: + raise BadConfigurationError( + "Only one of retry_on or no_retry_on may given") + + def bind_wrapper (wrapped): + + @app.task (bind = True, base = base) + @wraps(wrapped) + def exec_wrapper (*args, **kwargs): + try: + wrapped (*args, **kwargs) + except Exception as e: + if retry_on: + for x in retry_on: + if isinstance (e, x): + retry_handler (self, e, local_settings = local_settings) + return + sentry_exception (e, self, local_settings = local_settings) + if no_retry_on: + for x in no_retry_on: + if isinstance (e, x): + sentry_exception (e, self, local_settings = local_settings) + return + retry_handler (self, local_settings = local_settings) + return exec_wrapper + return bind_wrapper + @logtool.log_call def sentry_exception (e, task, message = None, local_settings = None): """Yes, this eats exceptions""" From 3f9dd513f66bcd3150a5ef4648fba40ba502b893 Mon Sep 17 00:00:00 2001 From: Dillon Dixon Date: Wed, 18 May 2016 12:33:54 -0700 Subject: [PATCH 2/5] Changed default behaviour to retry on all exceptions --- qworkerd/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qworkerd/main.py b/qworkerd/main.py index b50c624..669649c 100644 --- a/qworkerd/main.py +++ b/qworkerd/main.py @@ -67,12 +67,14 @@ def exec_wrapper (*args, **kwargs): retry_handler (self, e, local_settings = local_settings) return sentry_exception (e, self, local_settings = local_settings) + return if no_retry_on: for x in no_retry_on: if isinstance (e, x): sentry_exception (e, self, local_settings = local_settings) return - retry_handler (self, local_settings = local_settings) + retry_handler (self, e, local_settings = local_settings) + return return exec_wrapper return bind_wrapper From 288fea16ebf11a4fe4db15813b3f7907f2cddbce Mon Sep 17 00:00:00 2001 From: Dillon Dixon Date: Wed, 18 May 2016 14:24:17 -0700 Subject: [PATCH 3/5] Added missing self argument --- qworkerd/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qworkerd/main.py b/qworkerd/main.py index 669649c..51764f7 100644 --- a/qworkerd/main.py +++ b/qworkerd/main.py @@ -57,9 +57,9 @@ def bind_wrapper (wrapped): @app.task (bind = True, base = base) @wraps(wrapped) - def exec_wrapper (*args, **kwargs): + def exec_wrapper (self, *args, **kwargs): try: - wrapped (*args, **kwargs) + wrapped (self, *args, **kwargs) except Exception as e: if retry_on: for x in retry_on: From 90353e1d90993c6797534eb52727d15c14976c32 Mon Sep 17 00:00:00 2001 From: Dillon Dixon Date: Thu, 19 May 2016 13:50:23 -0700 Subject: [PATCH 4/5] Fixed for result backend implementations --- qworkerd/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/qworkerd/main.py b/qworkerd/main.py index 51764f7..239785d 100644 --- a/qworkerd/main.py +++ b/qworkerd/main.py @@ -56,10 +56,11 @@ def qworkerd_task (base = QWTask, retry_on = (), no_retry_on = (), def bind_wrapper (wrapped): @app.task (bind = True, base = base) - @wraps(wrapped) + @wraps (wrapped) def exec_wrapper (self, *args, **kwargs): try: - wrapped (self, *args, **kwargs) + rc = wrapped (self, *args, **kwargs) + return rc except Exception as e: if retry_on: for x in retry_on: From 273ab1928a23a38970847a98d747c44d022fb4c1 Mon Sep 17 00:00:00 2001 From: Dillon Dixon Date: Fri, 20 May 2016 17:42:43 -0700 Subject: [PATCH 5/5] Updated for correct failure/retry handling --- qworkerd/tasks.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/qworkerd/tasks.py b/qworkerd/tasks.py index c528d51..66e9c96 100644 --- a/qworkerd/tasks.py +++ b/qworkerd/tasks.py @@ -12,7 +12,7 @@ @logtool.log_call def qworkerd_task (base = QWTask, retry_on = (), no_retry_on = (), - local_settings = None): + fail_handler = None): """Method decorator for QWorkerd plugins""" if retry_on and no_retry_on: raise BadConfigurationError( @@ -30,16 +30,15 @@ def exec_wrapper (self, *args, **kwargs): if retry_on: for x in retry_on: if isinstance (e, x): - retry_handler (self, e, local_settings = local_settings) + retry_handler (self, e, fail_handler) return - sentry_exception (e, self, local_settings = local_settings) + raise return if no_retry_on: for x in no_retry_on: if isinstance (e, x): - sentry_exception (e, self, local_settings = local_settings) - return - retry_handler (self, e, local_settings = local_settings) + raise + retry_handler (self, e, fail_handler) return return exec_wrapper return bind_wrapper