From 1c258fcaa339778ec729a67a2984383901245ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 6 Aug 2024 20:59:34 +0800 Subject: [PATCH] fix(p2p): tcp fast fail to main queue --- gold/p2p/tcp/tcp.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/gold/p2p/tcp/tcp.go b/gold/p2p/tcp/tcp.go index 1ff7fbd..ad17082 100644 --- a/gold/p2p/tcp/tcp.go +++ b/gold/p2p/tcp/tcp.go @@ -100,13 +100,14 @@ type subconn struct { // Conn 伪装成无状态的有状态连接 type Conn struct { - addr *EndPoint - lstn *net.TCPListener - peers *ttl.Cache[string, *net.TCPConn] - recv chan *connrecv - cplk *sync.Mutex - sblk *sync.RWMutex - subs []*subconn + addr *EndPoint + lstn *net.TCPListener + peers *ttl.Cache[string, *net.TCPConn] + recv chan *connrecv + cplk *sync.Mutex + sblk *sync.RWMutex + subs []*subconn + suberr bool } func (conn *Conn) accept() { @@ -440,8 +441,13 @@ func (conn *Conn) WriteToPeer(b []byte, ep p2p.EndPoint) (n int, err error) { if len(b) >= 65536 { return 0, errors.New("data size " + strconv.Itoa(len(b)) + " is too large") } - if !conn.cplk.TryLock() { - return conn.writeToPeer(b, tcpep, true) + if !conn.suberr && !conn.cplk.TryLock() { + n, err = conn.writeToPeer(b, tcpep, true) // try sub write + if err == nil { + return + } + conn.suberr = true // fast fail + conn.cplk.Lock() // add to main queue } defer conn.cplk.Unlock() return conn.writeToPeer(b, tcpep, false)