Kaynağa Gözat

wgengine/magicsock: remove a per-DERP-packet map lookup in common case

Updates #150

Change-Id: Iffb6eccbe7ca97af97d29be63b7e37d487b3ba28
Signed-off-by: Brad Fitzpatrick <[email protected]>
Brad Fitzpatrick 4 yıl önce
ebeveyn
işleme
5404a0557b
1 değiştirilmiş dosya ile 7 ekleme ve 3 silme
  1. 7 3
      wgengine/magicsock/magicsock.go

+ 7 - 3
wgengine/magicsock/magicsock.go

@@ -1508,6 +1508,7 @@ func (c *Conn) runDerpReader(ctx context.Context, derpFakeAddr netaddr.IPPort, d
 	peerPresent := map[key.NodePublic]bool{}
 	bo := backoff.NewBackoff(fmt.Sprintf("derp-%d", regionID), c.logf, 5*time.Second)
 	var lastPacketTime time.Time
+	var lastPacketSrc key.NodePublic
 
 	for {
 		msg, connGen, err := dc.RecvDetail()
@@ -1569,9 +1570,12 @@ func (c *Conn) runDerpReader(ctx context.Context, derpFakeAddr netaddr.IPPort, d
 			}
 			// If this is a new sender we hadn't seen before, remember it and
 			// register a route for this peer.
-			if _, ok := peerPresent[res.src]; !ok {
-				peerPresent[res.src] = true
-				c.addDerpPeerRoute(res.src, regionID, dc)
+			if res.src != lastPacketSrc { // avoid map lookup w/ high throughput single peer
+				lastPacketSrc = res.src
+				if _, ok := peerPresent[res.src]; !ok {
+					peerPresent[res.src] = true
+					c.addDerpPeerRoute(res.src, regionID, dc)
+				}
 			}
 		case derp.PingMessage:
 			// Best effort reply to the ping.