control/controlclient: don't clone self node on each NetworkMap

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 <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2023-08-21 15:14:22 -07:00 committed by Brad Fitzpatrick
parent a461d230db
commit cb4a61f951

View File

@ -62,7 +62,7 @@ type mapSession struct {
onSelfNodeChanged func(*netmap.NetworkMap) onSelfNodeChanged func(*netmap.NetworkMap)
// Fields storing state over the course of multiple MapResponses. // Fields storing state over the course of multiple MapResponses.
lastNode *tailcfg.Node lastNode tailcfg.NodeView
lastDNSConfig *tailcfg.DNSConfig lastDNSConfig *tailcfg.DNSConfig
lastDERPMap *tailcfg.DERPMap lastDERPMap *tailcfg.DERPMap
lastUserProfile map[tailcfg.UserID]tailcfg.UserProfile 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. // 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) nm := ms.netmapForResponse(resp)
@ -312,17 +312,17 @@ func (ms *mapSession) netmapForResponse(resp *tailcfg.MapResponse) *netmap.Netwo
} }
if resp.Node != nil { if resp.Node != nil {
ms.lastNode = resp.Node ms.lastNode = resp.Node.View()
} }
if node := ms.lastNode.Clone(); node != nil { if node := ms.lastNode; node.Valid() {
nm.SelfNode = node.View() nm.SelfNode = node
nm.Expiry = node.KeyExpiry nm.Expiry = node.KeyExpiry()
nm.Name = node.Name nm.Name = node.Name()
nm.Addresses = filterSelfAddresses(node.Addresses) nm.Addresses = filterSelfAddresses(node.Addresses().AsSlice())
if node.Hostinfo.Valid() { if node.Hostinfo().Valid() {
nm.Hostinfo = *node.Hostinfo.AsStruct() nm.Hostinfo = *node.Hostinfo().AsStruct()
} }
if node.MachineAuthorized { if node.MachineAuthorized() {
nm.MachineStatus = tailcfg.MachineAuthorized nm.MachineStatus = tailcfg.MachineAuthorized
} else { } else {
nm.MachineStatus = tailcfg.MachineUnauthorized nm.MachineStatus = tailcfg.MachineUnauthorized