From efa224373fc30dea6f4c51855befc582c7948d00 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Fri, 4 Apr 2025 11:54:19 +0800 Subject: [PATCH] fix: shut it down more aggressively in grpc transport closing --- transport/gun/transport_close.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/transport/gun/transport_close.go b/transport/gun/transport_close.go index b09df5a3..70a39b5b 100644 --- a/transport/gun/transport_close.go +++ b/transport/gun/transport_close.go @@ -1,7 +1,10 @@ package gun import ( + "net" + "net/http" "sync" + "time" "unsafe" "golang.org/x/net/http2" @@ -13,11 +16,31 @@ type clientConnPool struct { conns map[string][]*http2.ClientConn // key is host:port } +type clientConn struct { + t *http.Transport + tconn net.Conn // usually *tls.Conn, except specialized impls +} + type efaceWords struct { typ unsafe.Pointer data unsafe.Pointer } +type tlsConn interface { + net.Conn + NetConn() net.Conn +} + +func closeClientConn(cc *http2.ClientConn) { // like forceCloseConn() in http2.ClientConn but also apply for tls-like conn + if conn, ok := (*clientConn)(unsafe.Pointer(cc)).tconn.(tlsConn); ok { + t := time.AfterFunc(time.Second, func() { + _ = conn.NetConn().Close() + }) + defer t.Stop() + } + _ = cc.Close() +} + func (tw *TransportWrap) Close() error { connPool := transportConnPool(tw.Transport) p := (*clientConnPool)((*efaceWords)(unsafe.Pointer(&connPool)).data) @@ -25,7 +48,7 @@ func (tw *TransportWrap) Close() error { defer p.mu.Unlock() for _, vv := range p.conns { for _, cc := range vv { - cc.Close() + closeClientConn(cc) } } return nil