diff --git a/core/state.py b/core/state.py index c050faf..df886f8 100644 --- a/core/state.py +++ b/core/state.py @@ -250,12 +250,29 @@ class StateManager: return conn = self._get_write_conn() - try: - with conn: + for attempt in range(6): + try: + conn.execute("BEGIN IMMEDIATE") for sql, params in batch: conn.execute(sql, params) - except Exception: - logger.exception("StateManager flush failed (%d ops)", len(batch)) + conn.execute("COMMIT") + return + except sqlite3.OperationalError as e: + try: + conn.execute("ROLLBACK") + except Exception: + pass + if attempt < 5: + time.sleep(0.5 * (attempt + 1)) + else: + logger.error("StateManager flush failed after 6 attempts (%d ops): %s", len(batch), e) + except Exception: + try: + conn.execute("ROLLBACK") + except Exception: + pass + logger.exception("StateManager flush failed (%d ops)", len(batch)) + return def _writer_loop(self) -> None: """Background loop: flush write queue every FLUSH_INTERVAL seconds."""