diff --git a/fleetd/src/main/java/dev/ltms/fleet/session/SessionManager.java b/fleetd/src/main/java/dev/ltms/fleet/session/SessionManager.java index cf8d8d5..9c093c0 100644 --- a/fleetd/src/main/java/dev/ltms/fleet/session/SessionManager.java +++ b/fleetd/src/main/java/dev/ltms/fleet/session/SessionManager.java @@ -294,6 +294,11 @@ public final class SessionManager implements TurnListener { */ private boolean releaseIfCurrent(MemberSession expected, ReleaseCause cause) { if (!registry.remove(expected.paneId(), expected)) { + // A lifecycle transition replaced the record between the caller's check and this remove. + // Log it: this race is by definition unobservable otherwise, and a reaper that silently + // declines to reap is the hardest kind of behaviour to diagnose after the fact. + log.debug("skipping reap of pane={}: its registry record changed after the idle check " + + "(most likely a delivery made it BUSY)", expected.paneId()); return false; } releaseRemoved(expected.paneId(), expected, handles.remove(expected.paneId()), cause);