Go net/rpc pool: drop dead conns at checkout, don't retry
A pooled Go net/rpc client kept idle connections to peers. After a peer was kill -9'd and restarted, the first call from every other node failed with rpc.ErrShutdown ('connection is shut down'), and the retry succeeded. Retry-once on ErrShutdown is not enough: the pool keeps several idle conns per peer, so the retry can pick up a second dead one. Fix it at the pool instead. Wrap net.Conn in a type whose Read sets an atomic 'broken' flag on error, and pass that wrapper to rpc.NewClient. net/rpc's background read loop gets EOF as soon as the kernel delivers the FIN from the killed process, so by the next call the flag is already set. pool.get then pops idle conns and drops the broken ones until it finds a live one or dials fresh. No retry means you never have to ask whether resending a request is safe. Reproduce it in a test: fill the pool to its max idle count, close the server, re-Listen on the same address, and require the first call to succeed.