mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-18 04:41:56 +00:00
fix(kanban): drop redundant init_db() in gateway watchers (#21378)
Both `_kanban_notifier_watcher` and `_kanban_dispatcher_watcher`'s
`_tick_once_for_board` called `_kb.connect(board=slug)` immediately
followed by `_kb.init_db(board=slug)`. Since `connect()` already runs
the schema + idempotent migration on first open per process, the
explicit `init_db()` was redundant — and worse, `init_db()` deliberately
busts the per-process `_INITIALIZED_PATHS` cache and re-runs the migration
on a *second* connection that races the first.
On every cold gateway start against a legacy DB this surfaced as either
`sqlite3.OperationalError: duplicate column name: <col>` or intermittent
`database is locked` errors logged at the first tick. The duplicate-column
case is now tolerated by `_add_column_if_missing` (commit 78698381a), but
the wasted second migration plus the database-is-locked race remain
fixable by skipping the redundant call entirely.
Drops `_kb.init_db(board=slug)` at both call sites and adds a regression
test in `tests/hermes_cli/test_kanban_notify.py` that pins the absence
via source inspection plus a runtime spy.
Co-authored-by: Teknium <127238744+teknium1@users.noreply.github.com>
This commit is contained in:
parent
68e44642c8
commit
6f2d60559e
2 changed files with 122 additions and 8 deletions
|
|
@ -3887,10 +3887,18 @@ class GatewayRunner:
|
|||
except Exception:
|
||||
continue
|
||||
try:
|
||||
try:
|
||||
_kb.init_db(board=slug) # idempotent; handles first-run
|
||||
except Exception:
|
||||
pass
|
||||
# `connect()` runs the schema + idempotent migration
|
||||
# on first open per process, so an explicit
|
||||
# `init_db()` here would be redundant. Worse:
|
||||
# `init_db()` deliberately busts the per-process
|
||||
# cache and re-runs the migration on a *second*
|
||||
# connection, which races the first and used to
|
||||
# log a benign but noisy `duplicate column name`
|
||||
# traceback (and intermittent "database is locked"
|
||||
# — issue #21378) on every gateway start against
|
||||
# a legacy DB. `_add_column_if_missing` now
|
||||
# tolerates that race, but we still skip the
|
||||
# redundant call to avoid the wasted work.
|
||||
subs = _kb.list_notify_subs(conn)
|
||||
for sub in subs:
|
||||
cursor, events = _kb.unseen_events_for_sub(
|
||||
|
|
@ -4183,10 +4191,12 @@ class GatewayRunner:
|
|||
conn = None
|
||||
try:
|
||||
conn = _kb.connect(board=slug)
|
||||
try:
|
||||
_kb.init_db(board=slug) # idempotent, handles first-run
|
||||
except Exception:
|
||||
pass
|
||||
# `connect()` runs the schema + idempotent migration on
|
||||
# first open per process; the previous explicit
|
||||
# `init_db()` call here busted the per-process cache and
|
||||
# re-ran the migration on a second connection, racing
|
||||
# the first. See the matching comment in
|
||||
# `_kanban_notifier_watcher` and issue #21378.
|
||||
return _kb.dispatch_once(
|
||||
conn,
|
||||
board=slug,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue