summaryrefslogtreecommitdiff
path: root/src/mailman/core/runner.py
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/core/runner.py
parentdfb807e04037786a62e7635d0b37e0695a77d5d6 (diff)
downloadmailman-7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0.tar.gz
mailman-7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0.tar.zst
mailman-7c97e8fbdb90a1a0de1526d7a6f108e95415d6a0.zip
Diffstat (limited to 'src/mailman/core/runner.py')
-rw-r--r--src/mailman/core/runner.py15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/mailman/core/runner.py b/src/mailman/core/runner.py
index 757d8837e..9f8094153 100644
--- a/src/mailman/core/runner.py
+++ b/src/mailman/core/runner.py
@@ -31,7 +31,8 @@ from mailman.core.logging import reopen
from mailman.core.switchboard import Switchboard
from mailman.interfaces.languages import ILanguageManager
from mailman.interfaces.listmanager import IListManager
-from mailman.interfaces.runner import IRunner, RunnerCrashEvent
+from mailman.interfaces.runner import (
+ IRunner, RunnerCrashEvent, RunnerInterrupt)
from mailman.utilities.string import expand
from public import public
from zope.component import getUtility
@@ -98,6 +99,16 @@ class Runner:
elif signum == signal.SIGHUP:
reopen()
rlog.info('%s runner caught SIGHUP. Reopening logs.', self.name)
+ # 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. Runners which implement their own run() method must be
+ # prepared to catch RunnerInterrupts, usually also ignoring them.
+ raise RunnerInterrupt
def set_signals(self):
"""See `IRunner`."""
@@ -113,7 +124,7 @@ class Runner:
def run(self):
"""See `IRunner`."""
# Start the main loop for this runner.
- with suppress(KeyboardInterrupt):
+ with suppress(KeyboardInterrupt, RunnerInterrupt):
while True:
# Once through the loop that processes all the files in the
# queue directory.