diff options
| author | Barry Warsaw | 2017-01-28 13:17:25 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2017-01-28 13:19:58 -0500 |
| commit | 7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0 (patch) | |
| tree | d49c10cccf7bfafa08fa7145a5860fa43e5615fb /src/mailman/interfaces | |
| parent | dfb807e04037786a62e7635d0b37e0695a77d5d6 (diff) | |
| download | mailman-7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0.tar.gz mailman-7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0.tar.zst mailman-7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0.zip | |
Handle PEP 475 fallout.
Closes #255
As of Python 3.5, PEP 475 gets in our way. Runners with long time.sleep()'s
in their _snooze() method (e.g. the retry runner) will have their system call
implemented time.sleep() automatically retried at the C layer. The only
reliable way to prevent this is to raise an exception in the signal handler.
The standard run() method automatically suppresses this exception, meaning,
it's caught and ignored, but effectively breaks the run() loop, which is just
what we want.
The lmtp and rest runners implement their own run loops, so they also have to
handle this exception, by ignoring it.
Diffstat (limited to 'src/mailman/interfaces')
| -rw-r--r-- | src/mailman/interfaces/runner.py | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/mailman/interfaces/runner.py b/src/mailman/interfaces/runner.py index 12a7e49ad..f85c759c1 100644 --- a/src/mailman/interfaces/runner.py +++ b/src/mailman/interfaces/runner.py @@ -34,6 +34,19 @@ class RunnerCrashEvent: @public +class RunnerInterrupt(Exception): + """A runner received a system call interrupting signal. + + PEP 475 automatically, and at the C layer, retries system calls such as + time.sleep(). This can mean runners with long sleeps in their _snooze() + method won't actually exit. This exception is always raised in Mailman's + runner signal handlers to prevent this behavior. Runners that implement + their own .run() method must be prepared to handle this, usually by + ignoring it. + """ + + +@public class IRunner(Interface): """The runner.""" |
