From 7f1225b0c47974c2f4f2f353a927777a000cd8ed Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Thu, 3 Apr 2025 22:41:05 +0800 Subject: [PATCH] fix: grpc transport can't be closed --- transport/gun/transport_close.go | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 transport/gun/transport_close.go diff --git a/transport/gun/transport_close.go b/transport/gun/transport_close.go new file mode 100644 index 00000000..b09df5a3 --- /dev/null +++ b/transport/gun/transport_close.go @@ -0,0 +1,35 @@ +package gun + +import ( + "sync" + "unsafe" + + "golang.org/x/net/http2" +) + +type clientConnPool struct { + t *http2.Transport + mu sync.Mutex + conns map[string][]*http2.ClientConn // key is host:port +} + +type efaceWords struct { + typ unsafe.Pointer + data unsafe.Pointer +} + +func (tw *TransportWrap) Close() error { + connPool := transportConnPool(tw.Transport) + p := (*clientConnPool)((*efaceWords)(unsafe.Pointer(&connPool)).data) + p.mu.Lock() + defer p.mu.Unlock() + for _, vv := range p.conns { + for _, cc := range vv { + cc.Close() + } + } + return nil +} + +//go:linkname transportConnPool golang.org/x/net/http2.(*Transport).connPool +func transportConnPool(t *http2.Transport) http2.ClientConnPool