Add config-driven glibc malloc_trim for long-lived Hermes processes: - hermes_cli/mem_trim.py: trim_memory() with configurable cooldown, RSS snapshot telemetry, and forced-trim INFO logging - gateway/run.py: periodic trim in gateway housekeeping loop - tui_gateway/server.py: trim in idle reaper (~every 5 min) - tui_gateway/slash_worker.py: trim on turn boundary - run_agent.py: force trim on agent close - hermes_cli/config.py: context.memory_trim config section (enabled, cooldown_seconds, log_every_n, info_log_min_delta_mb) CSA tier-4 reviewed (4 rounds, 0 HIGH/MEDIUM/CRITICAL remaining). Supersedes PR #63708 + #64591 with enhanced telemetry and gateway/slash_worker coverage.
33 lines
803 B
Python
33 lines
803 B
Python
"""Memory-trim coverage for the long-lived messaging gateway housekeeper."""
|
|
|
|
import gateway.run as gateway_run
|
|
|
|
|
|
class _OneTickStopEvent:
|
|
"""Run one housekeeping tick without a sleep or background thread."""
|
|
|
|
def __init__(self):
|
|
self.waited = False
|
|
|
|
def is_set(self):
|
|
return self.waited
|
|
|
|
def wait(self, timeout=None):
|
|
self.waited = True
|
|
return True
|
|
|
|
|
|
def test_gateway_housekeeping_calls_periodic_memory_trim(monkeypatch):
|
|
import hermes_cli.mem_trim as mem_trim
|
|
|
|
calls = []
|
|
monkeypatch.setattr(
|
|
mem_trim,
|
|
"trim_memory",
|
|
lambda **kwargs: calls.append(kwargs) or True,
|
|
)
|
|
|
|
gateway_run._start_gateway_housekeeping(_OneTickStopEvent(), interval=0)
|
|
|
|
assert calls == [{"reason": "messaging gateway housekeeping"}]
|