fix(honcho): guard _peers_cache and _sessions_cache reads under _cache_lock

_get_peer() and _get_or_create_honcho_session() accessed _peers_cache
and _sessions_cache without holding _cache_lock, while other paths
in the same class use the lock consistently. Under concurrent tool
calls or prefetch threads, this can produce stale reads or lost
cache updates.

Wrap both unguarded cache read sites in _cache_lock. Network calls
(honcho.peer() and honcho.session()) remain outside the lock to
avoid holding it during I/O.
This commit is contained in:
sprmn24
2026-04-27 23:03:12 +03:00
committed by Teknium
parent bea2562fc4
commit ec4cb16a29

View File

@@ -160,11 +160,13 @@ class HonchoSessionManager:
Peers are lazy -- no API call until first use. Peers are lazy -- no API call until first use.
Observation settings are controlled per-session via SessionPeerConfig. Observation settings are controlled per-session via SessionPeerConfig.
""" """
if peer_id in self._peers_cache: with self._cache_lock:
return self._peers_cache[peer_id] if peer_id in self._peers_cache:
return self._peers_cache[peer_id]
peer = self.honcho.peer(peer_id) peer = self.honcho.peer(peer_id)
self._peers_cache[peer_id] = peer with self._cache_lock:
self._peers_cache[peer_id] = peer
return peer return peer
def _get_or_create_honcho_session( def _get_or_create_honcho_session(
@@ -176,9 +178,10 @@ class HonchoSessionManager:
Returns: Returns:
Tuple of (honcho_session, existing_messages). Tuple of (honcho_session, existing_messages).
""" """
if session_id in self._sessions_cache: with self._cache_lock:
logger.debug("Honcho session '%s' retrieved from cache", session_id) if session_id in self._sessions_cache:
return self._sessions_cache[session_id], [] logger.debug("Honcho session '%s' retrieved from cache", session_id)
return self._sessions_cache[session_id], []
session = self.honcho.session(session_id) session = self.honcho.session(session_id)