From 72b6c3f065885739e8ec507366f010705e8522e4 Mon Sep 17 00:00:00 2001 From: Luke Mino-Altherr Date: Fri, 6 Feb 2026 15:33:30 -0800 Subject: [PATCH] Fix concurrency issues in AssetSeeder - Fix race in mark_missing_outside_prefixes: set state to RUNNING inside lock before operations, restore to IDLE in finally block to prevent concurrent start() calls - Fix timing consistency: capture perf_counter before _update_progress for consistent event timing Amp-Thread-ID: https://ampcode.com/threads/T-019c354b-e7d7-7309-aa0e-79e5e7dff2b7 Co-authored-by: Amp --- app/assets/seeder.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/app/assets/seeder.py b/app/assets/seeder.py index 23e001e5c..bb9934acd 100644 --- a/app/assets/seeder.py +++ b/app/assets/seeder.py @@ -197,18 +197,23 @@ class AssetSeeder: "Cannot mark missing assets while scan is running" ) return 0 + self._state = State.RUNNING - if not dependencies_available(): - logging.warning( - "Database dependencies not available, skipping mark missing" - ) - return 0 + try: + if not dependencies_available(): + logging.warning( + "Database dependencies not available, skipping mark missing" + ) + return 0 - all_prefixes = get_all_known_prefixes() - marked = mark_missing_outside_prefixes_safely(all_prefixes) - if marked > 0: - logging.info("Marked %d cache states as missing", marked) - return marked + all_prefixes = get_all_known_prefixes() + marked = mark_missing_outside_prefixes_safely(all_prefixes) + if marked > 0: + logging.info("Marked %d cache states as missing", marked) + return marked + finally: + with self._lock: + self._state = State.IDLE def _is_cancelled(self) -> bool: """Check if cancellation has been requested.""" @@ -362,9 +367,9 @@ class AssetSeeder: logging.exception("Batch insert failed at offset %d", i) scanned = i + len(batch) + now = time.perf_counter() self._update_progress(scanned=scanned, created=total_created) - now = time.perf_counter() if now - last_progress_time >= progress_interval: self._emit_event( "assets.seed.progress",