mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-24 18:50:15 +00:00
5b41f03a92
Two functions on the /api/session/handoff-summary hot path were opening sqlite3.connect(...) inside a bare `with` statement, which commits the transaction at scope exit but does NOT close the connection. Per-turn invocations accumulated state.db / state.db-wal file descriptors and CPython heap pages on long-lived worker threads, surfacing as the multi-GB VmRSS and 6x duplicated state.db fds observed on the live instance (D0 pre-restart baseline: VmRSS 1,334,248 kB, 55 fds; cold baseline after restart: VmRSS 136,668 kB, 10 fds). Wrap both call sites with contextlib.closing(...) (already imported and used at seven other sites in the same files) so the connection is closed deterministically: - api/models.py :: count_conversation_rounds - api/routes.py :: _persist_handoff_summary_to_state_db Regression test: tests/test_issue2233_sqlite_connection_leak.py loops both functions 20 times against a tmp state.db and asserts /proc/<pid>/fd count does not grow more than 2. Linux-only via sys.platform skip. D1 live soak against a freshly-built worktree server (port 8799, isolated HERMES_HOME / HERMES_WEBUI_STATE_DIR) hitting /api/session/handoff-summary 20 times: fd_before = 5 fd_after = 5 (growth 0, threshold < 5) vmrss_before = 52636 kB vmrss_after = 52636 kB (growth 0 kB, threshold < 30 MB) The patched fix curve trends below the leak curve. Rollback: single git revert <this-sha> reverts both file edits. Refs #2233.