[Checkins] SVN: zc.async/branches/dev/src/zc/async/ simplify and
rename mechanism for setting failure log level; other small cleanups
Gary Poster
gary at zope.com
Thu Jun 19 10:01:22 EDT 2008
Log message for revision 87551:
simplify and rename mechanism for setting failure log level; other small cleanups
Changed:
U zc.async/branches/dev/src/zc/async/CHANGES.txt
U zc.async/branches/dev/src/zc/async/TODO.txt
U zc.async/branches/dev/src/zc/async/job.py
U zc.async/branches/dev/src/zc/async/queue.py
U zc.async/branches/dev/src/zc/async/queue.txt
-=-
Modified: zc.async/branches/dev/src/zc/async/CHANGES.txt
===================================================================
--- zc.async/branches/dev/src/zc/async/CHANGES.txt 2008-06-19 13:01:11 UTC (rev 87550)
+++ zc.async/branches/dev/src/zc/async/CHANGES.txt 2008-06-19 14:01:21 UTC (rev 87551)
@@ -2,9 +2,8 @@
================
- made the log for finding an activated agent report the pertinent queue's oid
- as an unpacked integer, rather than the packed string blob. As mentioned
- above, use ``ZODB.utils.p64`` to convert back to an oid that the ZODB will
- recognize.
+ as an unpacked integer, rather than the packed string blob. Use
+ ``ZODB.utils.p64`` to convert back to an oid that the ZODB will recognize.
- Bugfix: in failing a job, the job thought it was in its old agent, and the
``fail`` call failed. This is now tested by the first example in new doctest
Modified: zc.async/branches/dev/src/zc/async/TODO.txt
===================================================================
--- zc.async/branches/dev/src/zc/async/TODO.txt 2008-06-19 13:01:11 UTC (rev 87550)
+++ zc.async/branches/dev/src/zc/async/TODO.txt 2008-06-19 14:01:21 UTC (rev 87551)
@@ -1,10 +1,14 @@
-Bugs and improvements:
+For release
- need to tell zc.twist.Partial for callbacks to retry forever: currently no
spelling for this in zc.twist. This makes using deferreds less reliable:
_callback *must* be called.
+
- be even more pessimistic about memory for saved polls and job info in
dispatcher.
+
+Bugs and improvements:
+
- queues should be pluggable like agent with filter
- show how to broadcast, maybe add conveniences
- show how to use with collapsing jobs (hint to future self: use external queue
Modified: zc.async/branches/dev/src/zc/async/job.py
===================================================================
--- zc.async/branches/dev/src/zc/async/job.py 2008-06-19 13:01:11 UTC (rev 87550)
+++ zc.async/branches/dev/src/zc/async/job.py 2008-06-19 14:01:21 UTC (rev 87551)
@@ -210,40 +210,11 @@
_status = zc.async.interfaces.NEW
_begin_after = _begin_by = _active_start = _active_end = None
key = None
- retry_policy_factory = None
_retry_policy = None
- def getRetryPolicy(self):
- if self._retry_policy is not None:
- return self._retry_policy
- if self.retry_policy_factory is None:
- # first try to look up adapter with name of ''; then if that fails
- # use RetryCommonFourTimes
- res = zope.component.queryAdapter(
- self, zc.async.interfaces.IRetryPolicy, '')
- if res is None:
- res = RetryCommonFourTimes(self)
- elif isinstance(self.retry_policy_factory, basestring):
- res = zope.component.getAdapter(
- self, zc.async.interfaces.IRetryPolicy,
- self.retry_policy_factory)
- # this may cause an error. We can't proceed because we don't know
- # what to do, and it may be *critical* to know. Therefore, in
- # _getRetry, we rely on never_fail to keep on sending critical
- # errors in the log, and never stopping.
- else:
- res = self.retry_policy_factory(self)
- self._retry_policy = res
- return res
-
- default_error_log_level = logging.ERROR
- error_log_level = None
-
- @property
- def effective_error_log_level(self):
- if self.error_log_level is None:
- return self.default_error_log_level
- return self.error_log_level
-
+ retry_policy_factory = None # effectively "look up IRetryPolicy adapter
+ # for '' (empty string) name, and use RetryCommonFourTimes if the adapter
+ # doesn't exist"
+ failure_log_level = None # effectively logging.ERROR
assignerUUID = None
_quota_names = ()
@@ -406,13 +377,14 @@
self._callable_root.parent = self
def addCallbacks(self, success=None, failure=None,
- error_log_level=None, retry_policy_factory=None):
+ failure_log_level=None, retry_policy_factory=None):
if success is not None or failure is not None:
if success is not None:
success = zc.async.interfaces.IJob(success)
- success.default_error_log_level = logging.CRITICAL
- if error_log_level is not None:
- success.error_log_level = error_log_level
+ if failure_log_level is not None:
+ success.failure_log_level = failure_log_level
+ elif success.failure_log_level is None:
+ success.failure_log_level = logging.CRITICAL
if retry_policy_factory is not None:
success.retry_policy_factory = retry_policy_factory
elif success.retry_policy_factory is None:
@@ -420,9 +392,10 @@
callback_retry_policy_factory)
if failure is not None:
failure = zc.async.interfaces.IJob(failure)
- failure.default_error_log_level = logging.CRITICAL
- if error_log_level is not None:
- failure.error_log_level = error_log_level
+ if failure_log_level is not None:
+ failure.failure_log_level = failure_log_level
+ elif failure.failure_log_level is None:
+ failure.failure_log_level = logging.CRITICAL
if retry_policy_factory is not None:
failure.retry_policy_factory = retry_policy_factory
elif failure.retry_policy_factory is None:
@@ -440,15 +413,12 @@
completeStartedJobArguments)
abort_handler.args.append(res)
res.addCallback(
- abort_handler, error_log_level, retry_policy_factory)
- abort_handler.default_error_log_level = logging.CRITICAL
- if error_log_level is not None:
- abort_handler.error_log_level = error_log_level
+ abort_handler, failure_log_level, retry_policy_factory)
else:
res = self
return res
- def addCallback(self, callback, error_log_level=None,
+ def addCallback(self, callback, failure_log_level=None,
retry_policy_factory=None):
callback = zc.async.interfaces.IJob(callback)
self.callbacks.put(callback)
@@ -458,15 +428,39 @@
else:
self._p_changed = True # to try and fire conflict errors if
# our reading of self.status has changed beneath us
- callback.default_error_log_level = logging.CRITICAL
- if error_log_level is not None:
- callback.error_log_level = error_log_level
+ if failure_log_level is not None:
+ callback.failure_log_level = failure_log_level
+ elif callback.failure_log_level is None:
+ callback.failure_log_level = logging.CRITICAL
if retry_policy_factory is not None:
callback.retry_policy_factory = retry_policy_factory
elif callback.retry_policy_factory is None:
callback.retry_policy_factory = callback_retry_policy_factory
return callback
+ def getRetryPolicy(self):
+ if self._retry_policy is not None:
+ return self._retry_policy
+ if self.retry_policy_factory is None:
+ # first try to look up adapter with name of ''; then if that fails
+ # use RetryCommonFourTimes
+ res = zope.component.queryAdapter(
+ self, zc.async.interfaces.IRetryPolicy, '')
+ if res is None:
+ res = RetryCommonFourTimes(self)
+ elif isinstance(self.retry_policy_factory, basestring):
+ res = zope.component.getAdapter(
+ self, zc.async.interfaces.IRetryPolicy,
+ self.retry_policy_factory)
+ # this may cause an error. We can't proceed because we don't know
+ # what to do, and it may be *critical* to know. Therefore, in
+ # _getRetry, we rely on never_fail to keep on sending critical
+ # errors in the log, and never stopping.
+ else:
+ res = self.retry_policy_factory(self)
+ self._retry_policy = res
+ return res
+
def _getRetry(self, call_name, tm, *args):
# if we are after the time that we are supposed to begin_by, no retry
if (self.begin_by is not None and self.begin_after is not None and
@@ -551,8 +545,11 @@
continue
# policy didn't exist or returned False or couldn't reschedule
if isinstance(res, twisted.python.failure.Failure):
+ log_level = self.failure_log_level
+ if log_level is None:
+ log_level = logging.ERROR
zc.async.utils.log.log(
- self.effective_error_log_level,
+ log_level,
'Commit failed for %r (see subsequent traceback). '
'Prior to this, job failed with traceback:\n%s',
self,
@@ -687,8 +684,11 @@
def _log_completion(self, res):
if isinstance(res, twisted.python.failure.Failure):
+ log_level = self.failure_log_level
+ if log_level is None:
+ log_level = logging.ERROR
zc.async.utils.log.log(
- self.effective_error_log_level,
+ log_level,
'%r failed with traceback:\n%s',
self,
res.getTraceback(
Modified: zc.async/branches/dev/src/zc/async/queue.py
===================================================================
--- zc.async/branches/dev/src/zc/async/queue.py 2008-06-19 13:01:11 UTC (rev 87550)
+++ zc.async/branches/dev/src/zc/async/queue.py 2008-06-19 14:01:21 UTC (rev 87551)
@@ -120,12 +120,12 @@
j = queue.put(
job.handleInterrupt,
retry_policy_factory=zc.async.job.RetryCommonForever,
- error_log_level=logging.CRITICAL)
+ failure_log_level=logging.CRITICAL)
elif job.status == zc.async.interfaces.CALLBACKS:
j = queue.put(
job.resumeCallbacks,
retry_policy_factory=zc.async.job.RetryCommonForever,
- error_log_level=logging.CRITICAL)
+ failure_log_level=logging.CRITICAL)
elif job.status == zc.async.interfaces.COMPLETED:
# huh, that's odd.
agent.completed.add(job)
@@ -267,10 +267,10 @@
self.dispatchers.__parent__ = self
def put(self, item, begin_after=None, begin_by=None,
- error_log_level=None, retry_policy_factory=None):
+ failure_log_level=None, retry_policy_factory=None):
item = zc.async.interfaces.IJob(item)
- if error_log_level is not None:
- item.error_log_level = error_log_level
+ if failure_log_level is not None:
+ item.failure_log_level = failure_log_level
if retry_policy_factory is not None:
item.retry_policy_factory = retry_policy_factory
if item.status != zc.async.interfaces.NEW:
Modified: zc.async/branches/dev/src/zc/async/queue.txt
===================================================================
--- zc.async/branches/dev/src/zc/async/queue.txt 2008-06-19 13:01:11 UTC (rev 87550)
+++ zc.async/branches/dev/src/zc/async/queue.txt 2008-06-19 14:01:21 UTC (rev 87551)
@@ -794,9 +794,9 @@
have custom error log levels, and custom retry policies.
>>> import logging
- >>> queue[2].effective_error_log_level == logging.CRITICAL
+ >>> queue[2].failure_log_level == logging.CRITICAL
True
- >>> queue[3].effective_error_log_level == logging.CRITICAL
+ >>> queue[3].failure_log_level == logging.CRITICAL
True
>>> queue[2].retry_policy_factory is zc.async.job.RetryCommonForever
True
More information about the Checkins
mailing list