summaryrefslogtreecommitdiff
path: root/src/mailman/runners
diff options
context:
space:
mode:
authorBarry Warsaw2017-01-28 13:17:25 -0500
committerBarry Warsaw2017-01-28 13:19:58 -0500
commit7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0 (patch)
treed49c10cccf7bfafa08fa7145a5860fa43e5615fb /src/mailman/runners
parentdfb807e04037786a62e7635d0b37e0695a77d5d6 (diff)
downloadmailman-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.py11
-rw-r--r--src/mailman/runners/rest.py8
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()