mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-05 12:42:30 +00:00
fix(agent): prevent stale lock leases after early compression exits (#54465)
This commit is contained in:
parent
f2ace45286
commit
cafe9d9261
2 changed files with 87 additions and 14 deletions
|
|
@ -253,6 +253,73 @@ def test_post_compress_exception_stops_lock_refresher(tmp_path: Path, monkeypatc
|
|||
assert db.try_acquire_compression_lock(parent_sid, "probe", ttl_seconds=1.0) is True
|
||||
|
||||
|
||||
def test_abort_warning_exception_stops_lock_refresher(tmp_path: Path, monkeypatch) -> None:
|
||||
"""An abort-path warning exception must still release the refreshed lock."""
|
||||
real_try_acquire = SessionDB.try_acquire_compression_lock
|
||||
|
||||
def _short_ttl(self, session_id: str, holder: str, ttl_seconds: float = 300.0) -> bool:
|
||||
return real_try_acquire(self, session_id, holder, ttl_seconds=1.0)
|
||||
|
||||
monkeypatch.setattr(SessionDB, "try_acquire_compression_lock", _short_ttl)
|
||||
|
||||
db = SessionDB(db_path=tmp_path / "state.db")
|
||||
parent_sid = "REFRESH_ABORT_TEST"
|
||||
db.create_session(parent_sid, source="discord")
|
||||
|
||||
agent = _build_agent_with_db(db, parent_sid)
|
||||
agent._compression_lock_ttl_seconds = 1.0
|
||||
agent._compression_lock_refresh_interval = 0.1
|
||||
|
||||
def _aborting_compress(*_a, **_kw):
|
||||
agent.context_compressor._last_compress_aborted = True
|
||||
agent.context_compressor._last_summary_error = "summary failed"
|
||||
return [{"role": "user", "content": "tail"}]
|
||||
|
||||
agent.context_compressor.compress.side_effect = _aborting_compress
|
||||
agent._emit_warning = lambda *_a, **_k: (_ for _ in ()).throw(RuntimeError("abort boom"))
|
||||
|
||||
messages = [{"role": "user", "content": f"m{i}"} for i in range(20)]
|
||||
|
||||
with pytest.raises(RuntimeError, match="abort boom"):
|
||||
agent._compress_context(messages, "sys", approx_tokens=120_000)
|
||||
|
||||
time.sleep(1.3)
|
||||
assert db.try_acquire_compression_lock(parent_sid, "probe", ttl_seconds=1.0) is True
|
||||
|
||||
|
||||
def test_typeerror_fallback_exception_stops_lock_refresher(tmp_path: Path, monkeypatch) -> None:
|
||||
"""A strict-signature fallback failure must still release the refreshed lock."""
|
||||
real_try_acquire = SessionDB.try_acquire_compression_lock
|
||||
|
||||
def _short_ttl(self, session_id: str, holder: str, ttl_seconds: float = 300.0) -> bool:
|
||||
return real_try_acquire(self, session_id, holder, ttl_seconds=1.0)
|
||||
|
||||
monkeypatch.setattr(SessionDB, "try_acquire_compression_lock", _short_ttl)
|
||||
|
||||
db = SessionDB(db_path=tmp_path / "state.db")
|
||||
parent_sid = "REFRESH_TYPEERROR_TEST"
|
||||
db.create_session(parent_sid, source="discord")
|
||||
|
||||
agent = _build_agent_with_db(db, parent_sid)
|
||||
agent._compression_lock_ttl_seconds = 1.0
|
||||
agent._compression_lock_refresh_interval = 0.1
|
||||
|
||||
def _strict_signature(*_a, **_kw):
|
||||
if "focus_topic" in _kw or "force" in _kw:
|
||||
raise TypeError("strict signature")
|
||||
raise RuntimeError("fallback boom")
|
||||
|
||||
agent.context_compressor.compress.side_effect = _strict_signature
|
||||
|
||||
messages = [{"role": "user", "content": f"m{i}"} for i in range(20)]
|
||||
|
||||
with pytest.raises(RuntimeError, match="fallback boom"):
|
||||
agent._compress_context(messages, "sys", approx_tokens=120_000)
|
||||
|
||||
time.sleep(1.3)
|
||||
assert db.try_acquire_compression_lock(parent_sid, "probe", ttl_seconds=1.0) is True
|
||||
|
||||
|
||||
class _NoLockSubsystemDB:
|
||||
"""Wraps a real SessionDB but simulates a pre-#34351 version skew.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue