repoze.retry

repoze.retry implements a WSGI middleware filter which intercepts “retryable” exceptions and retries the WSGI request a configurable number of times. Such exceptions are normally raised when a conflict is detected in an optimistic concurrency scheme [1] is configured for a database such Postgres [2] or ZODB [3] (in ZODB, optimistic concurrency is always enabled).

If the request cannot be satisfied via retries, the filter re-raises the exception.

Note

If your WSGI pipeline includes the transaction filter provided by repoze.tm or repoze.tm2, the retry filter should come before it (to the “left”), so that retried requests are first aborted and then restarted in a new transaction

Installation

Install using setuptools, e.g. (within a virtualenv):

$ easy_install repoze.retry

Configuration via Python

Wire up the middleware in your application:

from repoze.retry import Retry
mw = Retry(app, tries=3, retryable=(ValueError, IndexError))

By default, the retryable exception is repoze.retry.ConflictError.

  • If Zope2 is installed, the default is replaced by ZPublisher.Publish.Retry.
  • If ZODB is installed, the default is extended to include includes ZODB.POSException.ConflictError.

tries is an integer count, defaulting to 3 times.

Configuration via Paste

To use the default configuration, you can just include the filter in your application’s pipeline.

[pipeline:main]
pipeline =
     egg:Paste#cgitb
     egg:Paste#httpexceptions
     egg:repoze.retry#retry
     egg:repoze.tm#tm
     egg:repoze.vhm#vhm_xheaders
     zope2

If you want to override the defaults, e.g. to change the number of retries, or the exceptions which will be retried, configure the filter in a separate section:

[filter:retry]
use = egg:repoze.retry
tries = 2
retryable = mypackage.exceptions:SomeRetryableException

and then use it in your pipeline:

[pipeline:main]
pipeline =
     egg:Paste#cgitb
     egg:Paste#httpexceptions
     retry
     myapp

Reporting Bugs / Development Versions

The repoze developers hang out in the repoze IRC channel.

Email discussion of the filter’s development takes place on the repoze-dev mailing list.

Visit https://github.com/repoze/repoze.retry/issues to report bugs.

Visit http://github.com/repoze/repoze.retry/ to check out development or tagged versions.