diff --git a/net/peer/peer.go b/net/peer/peer.go index bd0d9b34..2a2c50b0 100644 --- a/net/peer/peer.go +++ b/net/peer/peer.go @@ -222,8 +222,15 @@ func (p *peer) gc(ttl time.Duration) { select { case <-act.Closed(): delete(p.active, act) + continue default: } + if act.LastUsage().Before(minLastUsage) { + log.Warn("close active connection because no activity", zap.String("peerId", p.id), zap.String("addr", p.Addr())) + _ = act.Close() + delete(p.active, act) + continue + } } } diff --git a/net/peer/peer_test.go b/net/peer/peer_test.go index c0046923..67d0f65d 100644 --- a/net/peer/peer_test.go +++ b/net/peer/peer_test.go @@ -105,6 +105,7 @@ func TestPeer_TryClose(t *testing.T) { }() defer out2.Close() fx.mc.EXPECT().Open(gomock.Any()).Return(in2, nil) + fx.mc.EXPECT().Addr().Return("") dc2, err := fx.AcquireDrpcConn(ctx) require.NoError(t, err) _ = dc2.Close() @@ -118,6 +119,18 @@ func TestPeer_TryClose(t *testing.T) { fx.mc.EXPECT().Open(gomock.Any()).Return(in3, nil) dc3, err := fx.AcquireDrpcConn(ctx) require.NoError(t, err) + + // make another active, should be removed by ttl + in4, out4 := net.Pipe() + go func() { + handshake.IncomingProtoHandshake(ctx, out4, defaultProtoChecker) + }() + defer out4.Close() + fx.mc.EXPECT().Open(gomock.Any()).Return(in4, nil) + dc4, err := fx.AcquireDrpcConn(ctx) + require.NoError(t, err) + defer dc4.Close() + fx.ReleaseDrpcConn(dc3) _ = dc3.Close() fx.ReleaseDrpcConn(dc)