fix(loop): lock /new snapshot and prune stale consolidation locks

This commit is contained in:
Alexander Minges
2026-02-20 13:29:18 +01:00
parent 9ada8e6854
commit c1b5e8c8d2
2 changed files with 115 additions and 2 deletions

View File

@@ -304,6 +304,14 @@ class AgentLoop:
self._consolidation_locks[session_key] = lock
return lock
def _prune_consolidation_lock(self, session_key: str, lock: asyncio.Lock) -> None:
"""Drop unused per-session lock entries to avoid unbounded growth."""
waiters = getattr(lock, "_waiters", None)
has_waiters = bool(waiters)
if lock.locked() or has_waiters:
return
self._consolidation_locks.pop(session_key, None)
async def _process_message(
self,
msg: InboundMessage,
@@ -334,11 +342,11 @@ class AgentLoop:
# Handle slash commands
cmd = msg.content.strip().lower()
if cmd == "/new":
messages_to_archive = session.messages.copy()
lock = self._get_consolidation_lock(session.key)
messages_to_archive: list[dict[str, Any]] = []
try:
async with lock:
messages_to_archive = session.messages[session.last_consolidated :].copy()
temp_session = Session(key=session.key)
temp_session.messages = messages_to_archive
archived = await self._consolidate_memory(temp_session, archive_all=True)
@@ -360,6 +368,7 @@ class AgentLoop:
session.clear()
self.sessions.save(session)
self.sessions.invalidate(session.key)
self._prune_consolidation_lock(session.key, lock)
return OutboundMessage(
channel=msg.channel,
chat_id=msg.chat_id,
@@ -382,6 +391,7 @@ class AgentLoop:
await self._consolidate_memory(session)
finally:
self._consolidating.discard(session.key)
self._prune_consolidation_lock(session.key, lock)
_task = asyncio.current_task()
if _task is not None:
self._consolidation_tasks.discard(_task)