From 1476061b600648bcc48b113d78385cb307dbd002 Mon Sep 17 00:00:00 2001 From: rkonfj Date: Sat, 15 Feb 2025 20:47:12 +0800 Subject: [PATCH] p2p: add cache for func PacketConn.relayPeer --- cache/cache.go | 2 +- p2p/conn.go | 42 +++++++++++++++++++++++------------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/cache/cache.go b/cache/cache.go index 96a28d5..5718090 100644 --- a/cache/cache.go +++ b/cache/cache.go @@ -33,7 +33,7 @@ var ( ) func init() { - defaultCache = lru.New[string, *CacheValue[any]](1024) + defaultCache = lru.New[string, *CacheValue[any]](2048) } // LoadTTL load value by key from default cache pool diff --git a/p2p/conn.go b/p2p/conn.go index 14fc2b7..088bdad 100644 --- a/p2p/conn.go +++ b/p2p/conn.go @@ -13,6 +13,7 @@ import ( "sync/atomic" "time" + "github.com/sigcn/pg/cache" "github.com/sigcn/pg/cache/lru" "github.com/sigcn/pg/disco" "github.com/sigcn/pg/disco/udp" @@ -265,27 +266,30 @@ func (c *PacketConn) PeerMeta(peerID disco.PeerID) url.Values { // relayPeer find the suitable relay peer func (c *PacketConn) relayPeer(peerID disco.PeerID) disco.PeerID { - peers := c.PeerStore().Peers() - for range len(peers) { - index := c.relayPeerIndex.Add(1) % uint64(len(peers)) - p := peers[index] - if p.PeerID == peerID { - continue - } - meta := c.PeerMeta(p.PeerID) - if meta == nil { - continue - } - if _, ok := disco.Labels(meta["label"]).Get("node.nr"); ok { - // can not as relay peer when `node.nr` label is present - continue - } - peerNAT := disco.NATType(meta.Get("nat")) - if peerNAT == disco.Easy || peerNAT == disco.IP4 || peerNAT == disco.IP46 { - return p.PeerID + selectRelayPeer := func(_ string) disco.PeerID { + peers := c.PeerStore().Peers() + for range len(peers) { + index := c.relayPeerIndex.Add(1) % uint64(len(peers)) + p := peers[index] + if p.PeerID == peerID { + continue + } + meta := c.PeerMeta(p.PeerID) + if meta == nil { + continue + } + if _, ok := disco.Labels(meta["label"]).Get("node.nr"); ok { + // can not as relay peer when `node.nr` label is present + continue + } + peerNAT := disco.NATType(meta.Get("nat")) + if peerNAT == disco.Easy || peerNAT == disco.IP4 || peerNAT == disco.IP46 { + return p.PeerID + } } + return "" } - return "" + return cache.LoadTTL(peerID.String(), time.Millisecond, selectRelayPeer) } // networkChangeDetect listen network change and restart udp and websocket listener