HyperKitty part en vrille après suppression d'une liste

Après suppression d’une liste Mailman 3, HyperKitty, le gestionnaire des archives, part en vrille et se met à consommer tout le processeur. Que se passe-t-il ?

Un coup d’œil au journal de Mailman (/var/log/mailman3/web/mailman-web.log) permet de comprendre le problème :

21:35:41 [Q] ERROR Failed [rebuild_mailinglist_cache_for_month] - MailingList matching query does not exist. : Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/django_q/cluster.py", line 421, in worker
    res = f(*task["args"], **task["kwargs"])
  File "/usr/lib/python3/dist-packages/hyperkitty/tasks.py", line 79, in _rebuild_mailinglist_cache_for_month
    mlist = MailingList.objects.get(name=mlist_name)
  File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 406, in get
    raise self.model.DoesNotExist(
hyperkitty.models.mailinglist.MailingList.DoesNotExist: MailingList matching query does not exist.

Mailman essaie de reconstruire le cache mensuel d’une liste (_rebuild_mailinglist_cache_for_month) et échoue car la liste n’existe pas (MailingList matching query does not exist). Et bêtement, Mailman semble ré-essayer en boucle.

Pour s’en tirer, nous allons jeter un œil au code :

vim +79 /usr/lib/python3/dist-packages/hyperkitty/tasks.py

La ligne indiquée dans le journal recherche la liste, mais sans s’assurer qu’elle existe :

def _rebuild_mailinglist_cache_for_month(mlist_name, year, month):
    mlist = MailingList.objects.get(name=mlist_name)
    mlist.cached_values["participants_count_for_month"].rebuild(year, month)

Il suffit donc d’ajouter une gestion de l’erreur pour corriger le problème :

def _rebuild_mailinglist_cache_for_month(mlist_name, year, month):
    try:
        mlist = MailingList.objects.get(name=mlist_name)
        mlist.cached_values["participants_count_for_month"].rebuild(year, month)
    except MailingList.DoesNotExist:
        log.warning(
            "Cannot rebuild the mailinglist cache: mailinglist %s does not exist.",
            mlist_name)
        return

Nouveau coup d’œil au journal après relance du service mailman-web :

WARNING 2022-07-10 10:20:31,902 15517 hyperkitty.tasks Cannot rebuild the mailinglist cache: mailinglist xxx@example.org does not exist.
10:20:32 [Q] INFO Process-1:1 processing [rebuild_mailinglist_cache_for_month]
10:20:32 [Q] INFO Processed [rebuild_mailinglist_cache_for_month]

La tâche se lance, constate que la liste n’est pas là et passe à la suite… Problème réglé.