From 5dcb52914b86fb9689ab470626eb5c5d8f874dec Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Tue, 24 Feb 2026 20:47:10 -0800 Subject: [PATCH] Catch failed vacuum --- app/routers/packets.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/routers/packets.py b/app/routers/packets.py index 049ebb1..317302b 100644 --- a/app/routers/packets.py +++ b/app/routers/packets.py @@ -278,9 +278,17 @@ async def run_maintenance(request: MaintenanceRequest) -> MaintenanceResult: deleted += purged_linked logger.info("Deleted %d linked raw packets", purged_linked) - # Run VACUUM to reclaim space on a dedicated connection - async with aiosqlite.connect(db.db_path) as vacuum_conn: - await vacuum_conn.executescript("VACUUM;") - logger.info("Database vacuumed") + # Run VACUUM to reclaim space on a dedicated connection. + # VACUUM requires exclusive access — if the main connection is actively + # writing (background sync, message processing, etc.) it fails with + # SQLITE_BUSY. This is expected; we just report vacuumed=False. + vacuumed = False + try: + async with aiosqlite.connect(db.db_path) as vacuum_conn: + await vacuum_conn.executescript("VACUUM;") + vacuumed = True + logger.info("Database vacuumed") + except Exception as e: + logger.warning("VACUUM skipped (database busy): %s", e) - return MaintenanceResult(packets_deleted=deleted, vacuumed=True) + return MaintenanceResult(packets_deleted=deleted, vacuumed=vacuumed)