Add a socket timeout for the mail worker

A mail worker is a long running application. And sometimes, the IMAP server
just hangs for hours for no apparent reason. imaplib doesn't enable setting
a timeout, and setting it globally seems fine.
This commit is contained in:
Victor "multun" Collod 2019-02-10 18:41:58 +01:00
parent bde9ca34e2
commit 2f62b557e5

View file

@ -1,16 +1,21 @@
import logging import logging
import socket
import sys import sys
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand
from django.conf import settings from django.conf import settings
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
DEFAULT_IMAP_TIMEOUT = 20
class Command(BaseCommand): class Command(BaseCommand):
help = "Starts a mail worker" help = "Starts a mail worker"
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument("--imap_timeout", type=int, default=30)
parser.add_argument("worker_name") parser.add_argument("worker_name")
def handle(self, *args, **options): def handle(self, *args, **options):
@ -22,10 +27,17 @@ class Command(BaseCommand):
tracker = settings.TODO_MAIL_TRACKERS.get(worker_name, None) tracker = settings.TODO_MAIL_TRACKERS.get(worker_name, None)
if tracker is None: if tracker is None:
logger.error( logger.error(
f"couldn't find configuration for {worker_name} in TODO_MAIL_TRACKERS" "couldn't find configuration for %r in TODO_MAIL_TRACKERS",
worker_name
) )
sys.exit(1) sys.exit(1)
# set the default socket timeout (imaplib doesn't enable configuring it)
timeout = options["imap_timeout"]
if timeout:
socket.setdefaulttimeout(timeout)
# run the mail polling loop
producer = tracker["producer"] producer = tracker["producer"]
consumer = tracker["consumer"] consumer = tracker["consumer"]