From 5b05dbd31e7a55161fb9c3aca9f70f330bac0129 Mon Sep 17 00:00:00 2001 From: gilesb Date: Mon, 12 Jan 2026 17:42:12 +0000 Subject: [PATCH] Fix clear-data to actually delete run_cache entries - discard_run now deletes from run_cache and pending_runs tables - Add delete_run_cache() and delete_pending_run() database functions - Previously clear-data only cleared Redis, leaving DB cache intact Co-Authored-By: Claude Opus 4.5 --- app/services/run_service.py | 14 ++++++++++++-- database.py | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/app/services/run_service.py b/app/services/run_service.py index 8eda7aa..20f9246 100644 --- a/app/services/run_service.py +++ b/app/services/run_service.py @@ -482,8 +482,18 @@ class RunService: # Remove task_id mapping from Redis self.redis.delete(f"{self.task_key_prefix}{run_id}") - # Note: We don't delete from run_cache as that's a permanent record - # of completed work. The content itself remains in cache. + # Remove from run_cache database table + try: + await self.db.delete_run_cache(run_id) + except Exception as e: + import logging + logging.getLogger(__name__).warning(f"Failed to delete run_cache for {run_id}: {e}") + + # Remove pending run if exists + try: + await self.db.delete_pending_run(run_id) + except Exception: + pass return True, None diff --git a/database.py b/database.py index 40dda57..a36dcf7 100644 --- a/database.py +++ b/database.py @@ -1207,6 +1207,26 @@ async def list_runs_by_actor(actor_id: str, offset: int = 0, limit: int = 20) -> ] +async def delete_run_cache(run_id: str) -> bool: + """Delete a run from the cache.""" + async with pool.acquire() as conn: + result = await conn.execute( + "DELETE FROM run_cache WHERE run_id = $1", + run_id + ) + return result == "DELETE 1" + + +async def delete_pending_run(run_id: str) -> bool: + """Delete a pending run.""" + async with pool.acquire() as conn: + result = await conn.execute( + "DELETE FROM pending_runs WHERE run_id = $1", + run_id + ) + return result == "DELETE 1" + + # ============ Storage Backends ============ async def get_user_storage(actor_id: str) -> List[dict]: