Hi Mark, Thanks again for your answer.
First of all, all of what I write below happened on a test list server, so no real harm was done. I'm just curious how to recover from this, and how to get to what I need. :-) On Wed, 11 Sept 2024 at 21:16, Mark Sapiro <[email protected]> wrote: > On 9/11/24 00:23, Marco van Tol wrote: > > > > We're interested in the development of a feature in mailman3 where we can > > configure it to automatically expire/remove threads in/from the archive > > older than x number of days. > > The script at https://www.msapiro.net/scripts/prune_arch3 could be > easily modified to do this and then be run periodically by cron. > I made a modified version of the script, and ran it. (attachment: script-1.py) The script went on its way for a bit, and then blew up. (attachment: error-run-1.txt) Now the archive for the list is broken in the sense that when I search for "*", and order it by "earliest first", it will show a server error. The mailmanweb.log also gives errors when this happens. (attachment: mailman-web.log) I tried to run `./manage.py update_index` which did not fix the issue for the archive. I then ran `./manage.py rebuild_index` which did fix the issue for the archive. Following this I ran the script again, and it showed similar output, including an error message after a while, but on every run it would delete new messages. I could keep running it until all the messages that I needed to be gone were gone, and then do a final `rebuild_index` to get the server back in shape. The mailmanweb.log would show the occasional message like this while I was doing this: WARNING 2024-10-16 12:31:52,043 41 hyperkitty.tasks Cannot rebuild the thread cache: thread 28 does not exist. These did not re-appear after I rebuilt the index. Is there some call I need to make to refresh the Email.objects list between runs? Do I just blindly rerun `Email.objects.filter(<args>)` after every call to msg.delete()? And secondary: can I avoid the call to rebuild_index? The actual production server has a massive count of messages. Thanks! Marco van Tol RIPE NCC
f04331d81855:/opt/mailman-web-data$ python tol-test-3.py 2006-01-01
276
chair.ripe.net 2005-05-04 12:23:11+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 56
12:04:15 [Q] INFO Enqueued [default] 57
chair.ripe.net 2005-04-28 09:38:04+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 58
12:04:15 [Q] INFO Enqueued [default] 59
chair.ripe.net 2005-04-26 20:02:54+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 60
12:04:15 [Q] INFO Enqueued [default] 61
chair.ripe.net 2005-04-26 23:37:03+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 62
chair.ripe.net 2005-04-27 00:01:24+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 63
chair.ripe.net 2005-04-27 10:51:32+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 64
chair.ripe.net 2005-04-27 07:44:01+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 65
12:04:15 [Q] INFO Enqueued [default] 66
chair.ripe.net 2005-05-04 12:32:51+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 67
12:04:15 [Q] INFO Enqueued [default] 68
chair.ripe.net 2005-04-30 19:16:23+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 69
chair.ripe.net 2005-05-02 13:25:15+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 70
chair.ripe.net 2005-05-04 12:51:34+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 71
chair.ripe.net 2005-05-04 12:16:24+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 72
chair.ripe.net 2005-09-23 07:33:52+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 73
chair.ripe.net 2005-05-05 09:30:44+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 74
chair.ripe.net 2005-05-05 12:05:55+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 75
chair.ripe.net 2005-05-20 14:22:36+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 76
12:04:15 [Q] INFO Enqueued [default] 77
chair.ripe.net 2005-05-20 15:04:23+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 78
chair.ripe.net 2005-05-24 23:16:32+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 79
chair.ripe.net 2005-07-28 01:09:13+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 80
chair.ripe.net 2005-07-25 13:43:37+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 81
12:04:15 [Q] INFO Enqueued [default] 82
chair.ripe.net 2005-07-27 07:35:36+00:00 <redacted>
12:04:15 [Q] INFO Enqueued [default] 83
chair.ripe.net 2005-08-25 12:24:57+00:00 <redacted>
12:04:16 [Q] INFO Enqueued [default] 84
12:04:16 [Q] INFO Enqueued [default] 85
chair.ripe.net 2005-08-26 22:50:05+00:00 <redacted>
Traceback (most recent call last):
File
"/usr/lib/python3.12/site-packages/django/db/models/fields/related_descriptors.py",
line 218, in __get__
rel_obj = self.field.get_cached_value(instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/django/db/models/fields/mixins.py",
line 15, in get_cached_value
return instance._state.fields_cache[cache_name]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'parent'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/mailman-web-data/tol-test-3.py", line 31, in <module>
msg.delete()
File "/usr/lib/python3.12/site-packages/django/db/models/base.py", line 1132,
in delete
return collector.delete()
^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/django/db/models/deletion.py", line
463, in delete
signals.pre_delete.send(
File "/usr/lib/python3.12/site-packages/django/dispatch/dispatcher.py", line
177, in send
(receiver, receiver(signal=self, sender=sender, **named))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/hyperkitty/signals.py", line 61, in
Email_on_pre_delete
kwargs["instance"].on_pre_delete()
File "/usr/lib/python3.12/site-packages/hyperkitty/models/email.py", line
256, in on_pre_delete
if self.parent is None:
^^^^^^^^^^^
File
"/usr/lib/python3.12/site-packages/django/db/models/fields/related_descriptors.py",
line 236, in __get__
rel_obj = self.get_object(instance)
^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/usr/lib/python3.12/site-packages/django/db/models/fields/related_descriptors.py",
line 199, in get_object
return qs.get(self.field.get_reverse_related_filter(instance))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/django/db/models/query.py", line 637,
in get
raise self.model.DoesNotExist(
hyperkitty.models.email.Email.DoesNotExist: Email matching query does not exist.
import os
import sys
import django
from datetime import datetime, timezone
sys.path.insert(0, '/opt/mailman-web')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
django.setup()
from hyperkitty.models.email import Email
def usage():
print(f'Usage: {sys.argv[0]} yyyy-mm-dd', file=sys.stderr)
sys.exit(1)
if len(sys.argv) != 2:
usage()
try:
year, month, day = sys.argv[1].split('-')
except ValueError:
usage()
try:
cutoff = datetime(int(year), int(month), int(day), tzinfo=timezone.utc)
except (TypeError, ValueError):
usage()
count = 0
print(Email.objects.filter(mailinglist=4, date__lt=cutoff).count())
for msg in Email.objects.filter(mailinglist=4, date__lt=cutoff):
print(msg.mailinglist, msg.date, msg.sender)
msg.delete()
count += 1
print(f"Deleted {count} messages")
mailman-web.log
Description: Binary data
_______________________________________________ Mailman-Developers mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3/lists/mailman-developers.python.org/ Mailman FAQ: https://wiki.list.org/x/AgA3 Security Policy: https://wiki.list.org/x/QIA9
