From 995b39636020f7892e1cc8d3324568094e7f74e6 Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Mon, 16 Jun 2025 16:34:40 +0300 Subject: [PATCH] bug: fix invalid logs rotation --- .../database/operations/logs_operations.py | 11 ++++++---- .../operations/test_logs_operations.py | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/ahriman/core/database/operations/logs_operations.py b/src/ahriman/core/database/operations/logs_operations.py index 4dc5d0e6..f77e2107 100644 --- a/src/ahriman/core/database/operations/logs_operations.py +++ b/src/ahriman/core/database/operations/logs_operations.py @@ -153,10 +153,13 @@ class LogsOperations(Operations): """ delete from logs where (package_base, repository, process_id) in ( - select package_base, repository, process_id from logs - where repository = :repository - group by package_base, repository, process_id - order by min(created) desc limit -1 offset :offset + select package_base, repository, process_id from ( + select package_base, repository, process_id, row_number() over (partition by package_base order by max(created) desc) as rn + from logs + where repository = :repository + group by package_base, repository, process_id + ) + where rn > :offset ) """, { diff --git a/tests/ahriman/core/database/operations/test_logs_operations.py b/tests/ahriman/core/database/operations/test_logs_operations.py index 5257955d..65320d10 100644 --- a/tests/ahriman/core/database/operations/test_logs_operations.py +++ b/tests/ahriman/core/database/operations/test_logs_operations.py @@ -93,6 +93,27 @@ def test_logs_insert_get_multi(database: SQLite, package_ahriman: Package) -> No ] +def test_logs_rotate_remove_older(database: SQLite, package_ahriman: Package, + package_python_schedule: Package) -> None: + """ + must correctly remove old records + """ + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1", "p1"), 42.0, "message 1")) + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "1", "p1"), 43.0, "message 2")) + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 44.0, "message 3")) + database.logs_insert(LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 45.0, "message 4")) + database.logs_insert(LogRecord(LogRecordId(package_python_schedule.base, "3", "p1"), 40.0, "message 5")) + + database.logs_rotate(1) + assert database.logs_get(package_ahriman.base) == [ + LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 44.0, "message 3"), + LogRecord(LogRecordId(package_ahriman.base, "2", "p2"), 45.0, "message 4"), + ] + assert database.logs_get(package_python_schedule.base) == [ + LogRecord(LogRecordId(package_python_schedule.base, "3", "p1"), 40.0, "message 5"), + ] + + def test_logs_rotate_remove_all(database: SQLite, package_ahriman: Package) -> None: """ must remove all records when rotating with keep_last_records is 0