You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
client: force-close abandoned client streams via runtime cleanup
Attach a runtime.AddCleanup callback to every clientStream returned by
NewStream so that callers who drop the stream without consuming it have
the underlying *stream force-closed and removed from the connection's
stream map. Without this safety net a leaked stream's recv buffer fills
and the connection's read loop only recovers via the 1-second
ErrStreamFull fallback, leaving streamID slots and goroutines pinned
until that timeout fires.
The cleanup sets recvErr to errStreamAbandoned (unexported - the cleanup
runs after the clientStream is unreachable, so no caller is left to
match on it as a sentinel) and the abandon surfaces in the receive
loop's "failed to handle message" log via the existing error path.
Also adds NewClientWithContext so callers - notably tests - can supply a
parent context whose attached logger is used for the client's internal
goroutines, and a unit test that drives GC, asserts errStreamAbandoned
on the closed stream, verifies the connection is not deadlocked, and
captures the abandon log through the supplied context's logger.
Bumps the Go minimum to 1.24 for runtime.AddCleanup.
Signed-off-by: Derek McGowan <derek@mcg.dev>
0 commit comments