fix(sessions): warn once per state.db when 'source' column is missing
Observed: on a multi-profile install where one profile's state.db predates the agent's `source` column, errors.log gained one identical line every ~15 s (276 lines in ~70 min): api.models WARNING agent session listing skipped: state.db at /data/hermes/profiles/planner/state.db has no 'source' column (older hermes-agent?). Agent sessions unavailable. Upgrade hermes-agent to fix this. Mechanism: api/agent_sessions.py read_importable_agent_session_rows() runs `PRAGMA table_info(sessions)` and warns unconditionally when the column is absent (api/agent_sessions.py:564 before this change). api/models.py get_cli_sessions(all_profiles=True) calls it for every profile on every sidebar poll, behind only the 5 s _CLI_SESSIONS_CACHE_TTL_SECONDS cache, so the same DB re-emits the same warning on every cache miss. The condition is a property of the DB file, not of the poll. Fix: a module-level `_SOURCE_COLUMN_WARNED_DB_PATHS: set[str]` keyed by the resolved db_path. The warning fires the first time a given path is seen in the process and is suppressed after that; a different path warns on its own. Message text is unchanged. Process-lifetime only: a restart warns again, which is intended (the line remains the operator's cue that the agent still needs upgrading). Plain set mutation under the GIL is sufficient; a duplicate line from two racing first calls is harmless. Tests (tests/test_issue634.py, real pre-`source` sqlite DBs under tmp_path, asserting on captured log records): - same db_path called twice -> exactly one WARNING (failed before: `assert 2 == 1`) - two db_paths, then the first again -> exactly two WARNINGs, one per path (failed before: `assert 3 == 2`) The seven existing #634 source-shape tests still pass; neighbours test_issue3762/3930/5455/1494 pass. Deliberately not changed: the exception-path warning in get_cli_sessions() (api/models.py), the read-only-open fallback warning, and the 5 s cache TTL. The operator-side root cause (the agent reconciler creating a pre-`source` state.db) is a separate upstream fix; this only stops the repetition.
This commit is contained in:
1 parent
7d56234ea4
commit
12df57498a
2 files changed
+91
-6
No files matched your search
+20
-6
@@ -6,6 +6,17 @@ from pathlib import Path
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# state.db paths that already produced the "no 'source' column" warning below.
|
||||
# ``get_cli_sessions(all_profiles=True)`` re-reads every profile DB on every
|
||||
# sidebar poll (behind a 5 s cache), so a single pre-``source`` profile DB would
|
||||
# otherwise re-emit the identical WARNING line every ~15 s for the life of the
|
||||
# process. The condition is a property of the DB file, not of the poll, so it
|
||||
# is reported once per path. Process-lifetime only: a restart warns again,
|
||||
# which is the desired behaviour (the log line is the operator's cue that the
|
||||
# agent still needs upgrading). Plain ``set`` mutation under the GIL is
|
||||
# sufficient here; a duplicate line from two racing first calls is harmless.
|
||||
_SOURCE_COLUMN_WARNED_DB_PATHS: set[str] = set()
|
||||
|
||||
|
||||
def open_state_db_readonly(db_path: Path, log: logging.Logger | None = None) -> sqlite3.Connection:
|
||||
"""Open the live agent ``state.db`` read-only for a pure-read projection.
|
||||
@@ -562,12 +573,15 @@ def read_importable_agent_session_rows(
|
||||
cur.execute("PRAGMA table_info(messages)")
|
||||
message_cols = {row[1] for row in cur.fetchall()}
|
||||
if 'source' not in session_cols:
|
||||
log.warning(
|
||||
"agent session listing skipped: state.db at %s has no 'source' column "
|
||||
"(older hermes-agent?). Agent sessions unavailable. "
|
||||
"Upgrade hermes-agent to fix this.",
|
||||
db_path,
|
||||
)
|
||||
warned_key = str(db_path.resolve())
|
||||
if warned_key not in _SOURCE_COLUMN_WARNED_DB_PATHS:
|
||||
_SOURCE_COLUMN_WARNED_DB_PATHS.add(warned_key)
|
||||
log.warning(
|
||||
"agent session listing skipped: state.db at %s has no 'source' column "
|
||||
"(older hermes-agent?). Agent sessions unavailable. "
|
||||
"Upgrade hermes-agent to fix this.",
|
||||
db_path,
|
||||
)
|
||||
return []
|
||||
|
||||
parent_expr = _optional_col('parent_session_id', session_cols)
|
||||
|
||||
Reference in new issue
Block a user