From 4fdb7a4407ee02e243d2099d556624b631a3757e Mon Sep 17 00:00:00 2001 From: Pigway Date: Sat, 10 Oct 2026 01:35:32 +0800 Subject: [PATCH] Run initial retention checks regardless of host uptime --- pigway_frame_flow/display/cloud_library.py | 2 +- pigway_frame_flow/display/retention.py | 2 +- pigway_frame_flow/extensions/storage.py | 2 +- tests/test_retention.py | 21 +++++++++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/pigway_frame_flow/display/cloud_library.py b/pigway_frame_flow/display/cloud_library.py index 8c06e55..588de82 100644 --- a/pigway_frame_flow/display/cloud_library.py +++ b/pigway_frame_flow/display/cloud_library.py @@ -101,7 +101,7 @@ class CloudLibrary: return True def sweep(self): - if time.monotonic() - self.checked < 60: + if self.checked and time.monotonic() - self.checked < 60: return self.checked = time.monotonic() with self.service.lock: diff --git a/pigway_frame_flow/display/retention.py b/pigway_frame_flow/display/retention.py index 0217861..7b7de77 100644 --- a/pigway_frame_flow/display/retention.py +++ b/pigway_frame_flow/display/retention.py @@ -90,7 +90,7 @@ class Retention: ) def sweep(self): - if time.monotonic() - self.checked < 3600: + if self.checked and time.monotonic() - self.checked < 3600: return self.checked = time.monotonic() with self.service.lock: diff --git a/pigway_frame_flow/extensions/storage.py b/pigway_frame_flow/extensions/storage.py index b56ae9a..687426f 100644 --- a/pigway_frame_flow/extensions/storage.py +++ b/pigway_frame_flow/extensions/storage.py @@ -86,7 +86,7 @@ class LocalRetention: } def sweep(self, force=False, dry_run=False): - if not force and time.monotonic() - self.last < 3600: + if not force and self.last and time.monotonic() - self.last < 3600: return {} if not dry_run: self.last = time.monotonic() diff --git a/tests/test_retention.py b/tests/test_retention.py index 0ba04b3..7c06337 100644 --- a/tests/test_retention.py +++ b/tests/test_retention.py @@ -151,3 +151,24 @@ def test_cleanup_option_requires_random_photo_job(): source={"type": "template", "template": "quote"}, cleanup_unstarred=True, ) + + +def test_first_cleanup_runs_after_recent_host_boot( + client, service, settings, monkeypatch +): + image_id = upload_random(client, service, settings) + due(service, image_id) + monkeypatch.setattr( + "pigway_frame_flow.display.retention.time.monotonic", lambda: 120 + ) + service.retention.sweep() + row = service.db.one("SELECT * FROM image_retention WHERE image_id=?", (image_id,)) + assert row["cleanup_operation"] + assert service.retention.checked == 120 + service.retention.sweep() + assert ( + service.db.one("SELECT COUNT(*) AS n FROM operations WHERE action='delete'")[ + "n" + ] + == 1 + )