mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
fix(compression-lock): reclaim crashed holders instead of stranding the lease
The compression lock was gated so that any holder on a Windows host was assumed alive until the full TTL expired. A crashed holder therefore stranded every other agent on the session for the whole lease window. Probe liveness with psutil.pid_exists, which is safe on nt. Keep the os.kill(pid, 0) path strictly for POSIX: on Windows signal 0 maps to CTRL_C_EVENT (bpo-14484) and can kill the target's console group, so with psutil absent the only safe answer stays 'assume alive' and let the TTL run out. Also carry the commit fence through cancelled compressions so an aborted run leaves the lock reacquirable rather than half-held.
This commit is contained in:
parent
1c0884516c
commit
11c487e409
4 changed files with 177 additions and 35 deletions
|
|
@ -671,7 +671,17 @@ class _CompressionLockLeaseRefresher:
|
|||
# by the TTL the acquirer set — the lock can never be held past its TTL
|
||||
# by a stuck refresher.
|
||||
consecutive_failures = 0
|
||||
while not self._stop.wait(self._refresh_interval_seconds):
|
||||
# First refresh happens immediately, not one interval late. Everything
|
||||
# between try_acquire() and start() (the rotation-ownership lookup, the
|
||||
# durable-breaker re-read, thread startup) is charged against the very
|
||||
# first lease, so on a short TTL under load the lock could already be
|
||||
# expired — and reclaimable by a competing path — before tick #1.
|
||||
first = True
|
||||
while first or not self._stop.wait(self._refresh_interval_seconds):
|
||||
if first:
|
||||
first = False
|
||||
if self._stop.is_set():
|
||||
break
|
||||
try:
|
||||
refreshed = self._db.refresh_compression_lock(
|
||||
self._session_id,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue