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/runners | |
| 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/runners')
| -rw-r--r-- | src/mailman/runners/lmtp.py | 11 | ||||
| -rw-r--r-- | src/mailman/runners/rest.py | 8 |
2 files changed, 13 insertions, 6 deletions
diff --git a/src/mailman/runners/lmtp.py b/src/mailman/runners/lmtp.py index b5c7bbb1f..f24107bd7 100644 --- a/src/mailman/runners/lmtp.py +++ b/src/mailman/runners/lmtp.py @@ -40,12 +40,14 @@ import logging from aiosmtpd.controller import Controller from aiosmtpd.lmtp import LMTP +from contextlib import suppress from email.utils import parseaddr from mailman.config import config from mailman.core.runner import Runner from mailman.database.transaction import transactional from mailman.email.message import Message from mailman.interfaces.listmanager import IListManager +from mailman.interfaces.runner import RunnerInterrupt from mailman.utilities.datetime import now from mailman.utilities.email import add_message_hash from public import public @@ -240,7 +242,8 @@ class LMTPRunner(Runner): def run(self): """See `IRunner`.""" - self.lmtp.start() - while not self._stop: - self._snooze(0) - self.lmtp.stop() + with suppress(RunnerInterrupt): + self.lmtp.start() + while not self._stop: + self._snooze(0) + self.lmtp.stop() diff --git a/src/mailman/runners/rest.py b/src/mailman/runners/rest.py index a93d164c1..7758972ed 100644 --- a/src/mailman/runners/rest.py +++ b/src/mailman/runners/rest.py @@ -21,7 +21,9 @@ import signal import logging import threading +from contextlib import suppress from mailman.core.runner import Runner +from mailman.interfaces.runner import RunnerInterrupt from mailman.rest.wsgiapp import make_server from public import public @@ -59,10 +61,12 @@ class RESTRunner(Runner): def run(self): """See `IRunner`.""" - self._server.serve_forever() + with suppress(RunnerInterrupt): + self._server.serve_forever() def signal_handler(self, signum, frame): - super().signal_handler(signum, frame) + with suppress(RunnerInterrupt): + super().signal_handler(signum, frame) if signum in (signal.SIGTERM, signal.SIGINT, signal.SIGUSR1): # Set the flag that will terminate the TCPserver loop. self._event.set() |
