From f1c10cac2b4b69ef0bc1b7193723141c7112958f Mon Sep 17 00:00:00 2001 From: holger krekel Date: Tue, 9 Jul 2024 23:24:28 +0200 Subject: [PATCH] chunked deletion --- .../src/chatmaild/delete_inactive_users.py | 23 ++++++++++--------- .../tests/test_delete_inactive_users.py | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/chatmaild/src/chatmaild/delete_inactive_users.py b/chatmaild/src/chatmaild/delete_inactive_users.py index c2199b9e..2db1d37f 100644 --- a/chatmaild/src/chatmaild/delete_inactive_users.py +++ b/chatmaild/src/chatmaild/delete_inactive_users.py @@ -11,18 +11,19 @@ from .database import Database from .doveauth import iter_userdb_lastlogin_before -def remove_user(db, config, user): - user_mail_dir = config.get_user_maildir(user) - shutil.rmtree(user_mail_dir, ignore_errors=True) - with db.write_transaction() as conn: - conn.execute("DELETE FROM users WHERE addr = ?", (user,)) - - -def delete_inactive_users(db, config): +def delete_inactive_users(db, config, CHUNK=100): cutoff_date = time.time() - config.delete_inactive_users_after * 86400 - for user in iter_userdb_lastlogin_before(db, cutoff_date): - remove_user(db, config, user) - print(f"Deleted user: {user}") + + old_users = iter_userdb_lastlogin_before(db, cutoff_date) + chunks = (old_users[i : i + CHUNK] for i in range(0, len(old_users), CHUNK)) + for sublist in chunks: + for user in sublist: + user_mail_dir = config.get_user_maildir(user) + shutil.rmtree(user_mail_dir, ignore_errors=True) + + with db.write_transaction() as conn: + for user in sublist: + conn.execute("DELETE FROM users WHERE addr = ?", (user,)) def main(): diff --git a/chatmaild/src/chatmaild/tests/test_delete_inactive_users.py b/chatmaild/src/chatmaild/tests/test_delete_inactive_users.py index 164955a6..df22bebe 100644 --- a/chatmaild/src/chatmaild/tests/test_delete_inactive_users.py +++ b/chatmaild/src/chatmaild/tests/test_delete_inactive_users.py @@ -17,7 +17,7 @@ def test_remove_stale_users(db, example_config): # create some stale and some new accounts to_remove = [] - for i in range(10): + for i in range(150): addr = f"oldold{i:03}@chat.example.org" create_user(addr, last_login=old) with db.read_connection() as conn: