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é.