Skip to content

ListArchivers of mailing lists get corrupted.

Basically I'm having this exact issue.

Sometimes when a message is sent to one of the mailinglists, the message gets shunted and I see the following error in the mailmanlog.

Dec 30 15:48:26 2019 (2204) Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/mailman/core/runner.py", line 173, in _one_iteration
    self._process_one_file(msg, msgdata)
  File "/usr/local/lib/python3.6/site-packages/mailman/core/runner.py", line 266, in _process_one_file
    keepqueued = self._dispose(mlist, msg, msgdata)
  File "/usr/local/lib/python3.6/site-packages/mailman/runners/outgoing.py", line 93, in _dispose
    self._func(mlist, msg, msgdata)
  File "/usr/local/lib/python3.6/site-packages/mailman/mta/deliver.py", line 86, in deliver
    refused = agent.deliver(mlist, msg, msgdata)
  File "/usr/local/lib/python3.6/site-packages/mailman/mta/bulk.py", line 100, in deliver
    self.decorate(mlist, msg, msgdata)
  File "/usr/local/lib/python3.6/site-packages/mailman/mta/decorating.py", line 32, in decorate
    decorator.process(mlist, msg, msgdata)
  File "/usr/local/lib/python3.6/site-packages/mailman/handlers/decorate.py", line 264, in process
    process(mlist, msg, msgdata)
  File "/usr/local/lib/python3.6/site-packages/mailman/handlers/decorate.py", line 73, in process
    for archiver in IListArchiverSet(mlist).archivers:
  File "/usr/local/lib/python3.6/site-packages/zope.component-4.4.1-py3.6.egg/zope/component/hookable.py", line 33, in __call__
    return self.__implementation(*args, **kw)
  File "/usr/local/lib/python3.6/site-packages/zope.component-4.4.1-py3.6.egg/zope/component/_api.py", line 156, in adapter_hook
    return sitemanager.queryAdapter(object, interface, name, default)
  File "/usr/local/lib/python3.6/site-packages/zope.interface-4.4.3-py3.6-linux-x86_64.egg/zope/interface/registry.py", line 348, in queryAdapter
    return self.adapters.queryAdapter(object, interface, name, default)
  File "/usr/local/lib/python3.6/site-packages/mailman/database/transaction.py", line 85, in wrapper
    return function(args[0], config.db.store, *args[1:], **kws)
  File "/usr/local/lib/python3.6/site-packages/mailman/model/mailinglist.py", line 612, in __init__
    ListArchiver.name == archiver_name).one_or_none()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3278, in one_or_none
    "Multiple rows were found for one_or_none()"

Any following messages to this same mailinglist also get shunted. Somehow the mailinglist ends up with two mhonarc archivers, and this causes every message to get shunted. I'm not sure why it always is a mhonarc archiver. I'm also not sure how to go about debugging this problem. I have written a script which detects and fixes it, but it doesn't stop the problem from reappearing.

The script is as follows:

from mailman.interfaces.listmanager import IListManager
from zope.component import getUtility
from mailman.config import config
from mailman.model.mailinglist import ListArchiver

def get_list_manager():
    return getUtility(IListManager)

def get_mhonarc_archivers(mlist, thedb):
    return list(thedb.query(ListArchiver).filter(ListArchiver.mailing_list == mlist, ListArchiver.name == 'mhonarc'))

def remove_last(archivers, mlist, thedb):
    lastid = archivers[1].id
    thedb.query(ListArchiver).filter(ListArchiver.mailing_list == mlist, ListArchiver.name == 'mhonarc', ListArchiver.id == lastid).delete()

def do_the_thing(mlists, thedb):
    do_commit = False
    for mlist in mlists:
        mhonarcs = get_mhonarc_archivers(mlist, thedb)
        if len(mhonarcs) > 1:
            print("{} has {}".format(mlist.fqdn_listname, len(mhonarcs)))
            remove_last(mhonarcs, mlist, thedb)
            do_commit = True
    return do_commit


listmgr = get_list_manager()
mlists = list(listmgr.mailing_lists)
store = config.db.store
print()
do_commit = do_the_thing(mlists, store)
if do_commit:
    store.commit()

Let me know if there is anything else I can provide!