From cb4a61f951f28faedeaaec38c74e214c9d198c5f Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 21 Aug 2023 15:14:22 -0700 Subject: [PATCH] control/controlclient: don't clone self node on each NetworkMap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop in the bucket, but have to start somewhere. Real wins will come once this is done for peers. │ before │ after │ │ B/op │ B/op vs base │ MapSessionDelta/size_10-8 10.213Ki ± ∞ ¹ 9.650Ki ± ∞ ¹ -5.51% (p=0.008 n=5) MapSessionDelta/size_100-8 83.64Ki ± ∞ ¹ 83.08Ki ± ∞ ¹ -0.67% (p=0.008 n=5) MapSessionDelta/size_1000-8 800.8Ki ± ∞ ¹ 800.3Ki ± ∞ ¹ -0.07% (p=0.008 n=5) MapSessionDelta/size_10000-8 7.712Mi ± ∞ ¹ 7.711Mi ± ∞ ¹ -0.01% (p=0.008 n=5) geomean 271.1Ki 266.8Ki -1.59% │ before │ after │ │ allocs/op │ allocs/op vs base │ MapSessionDelta/size_10-8 73.00 ± ∞ ¹ 72.00 ± ∞ ¹ -1.37% (p=0.008 n=5) MapSessionDelta/size_100-8 524.0 ± ∞ ¹ 523.0 ± ∞ ¹ -0.19% (p=0.008 n=5) MapSessionDelta/size_1000-8 5.025k ± ∞ ¹ 5.024k ± ∞ ¹ -0.02% (p=0.008 n=5) MapSessionDelta/size_10000-8 50.02k ± ∞ ¹ 50.02k ± ∞ ¹ -0.00% (p=0.040 n=5) geomean 1.761k 1.754k -0.40% Updates #1909 Change-Id: Ie19dea3371de251d64d4373dd00422f53c2675ea Signed-off-by: Brad Fitzpatrick --- control/controlclient/map.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/control/controlclient/map.go b/control/controlclient/map.go index 96ef88beb..025907962 100644 --- a/control/controlclient/map.go +++ b/control/controlclient/map.go @@ -62,7 +62,7 @@ type mapSession struct { onSelfNodeChanged func(*netmap.NetworkMap) // Fields storing state over the course of multiple MapResponses. - lastNode *tailcfg.Node + lastNode tailcfg.NodeView lastDNSConfig *tailcfg.DNSConfig lastDERPMap *tailcfg.DERPMap lastUserProfile map[tailcfg.UserID]tailcfg.UserProfile @@ -182,7 +182,7 @@ func (ms *mapSession) HandleNonKeepAliveMapResponse(ctx context.Context, resp *t } // Call Node.InitDisplayNames on any changed nodes. - initDisplayNames(cmpx.Or(resp.Node, ms.lastNode).View(), resp) + initDisplayNames(cmpx.Or(resp.Node.View(), ms.lastNode), resp) nm := ms.netmapForResponse(resp) @@ -312,17 +312,17 @@ func (ms *mapSession) netmapForResponse(resp *tailcfg.MapResponse) *netmap.Netwo } if resp.Node != nil { - ms.lastNode = resp.Node - } - if node := ms.lastNode.Clone(); node != nil { - nm.SelfNode = node.View() - nm.Expiry = node.KeyExpiry - nm.Name = node.Name - nm.Addresses = filterSelfAddresses(node.Addresses) - if node.Hostinfo.Valid() { - nm.Hostinfo = *node.Hostinfo.AsStruct() + ms.lastNode = resp.Node.View() + } + if node := ms.lastNode; node.Valid() { + nm.SelfNode = node + nm.Expiry = node.KeyExpiry() + nm.Name = node.Name() + nm.Addresses = filterSelfAddresses(node.Addresses().AsSlice()) + if node.Hostinfo().Valid() { + nm.Hostinfo = *node.Hostinfo().AsStruct() } - if node.MachineAuthorized { + if node.MachineAuthorized() { nm.MachineStatus = tailcfg.MachineAuthorized } else { nm.MachineStatus = tailcfg.MachineUnauthorized