mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-12 05:37:32 +00:00
cmd/viewer,types/views,various: avoid allocations in pointer field getters whenever possible
In this PR, we add a generic views.ValuePointer type that can be used as a view for pointers to basic types and struct types that do not require deep cloning and do not have corresponding view types. Its Get/GetOk methods return stack-allocated shallow copies of the underlying value. We then update the cmd/viewer codegen to produce getters that return either concrete views when available or ValuePointer views when not, for pointer fields in generated view types. This allows us to avoid unnecessary allocations compared to returning pointers to newly allocated shallow copies. Updates #14570 Signed-off-by: Nick Khyl <nickk@tailscale.com>
This commit is contained in:
@@ -347,8 +347,7 @@ func (b *LocalBackend) driveRemotesFromPeers(nm *netmap.NetworkMap) []*drive.Rem
|
||||
// TODO(oxtoacart): for some reason, this correctly
|
||||
// catches when a node goes from offline to online,
|
||||
// but not the other way around...
|
||||
online := peer.Online()
|
||||
if online == nil || !*online {
|
||||
if !peer.Online().Get() {
|
||||
return false
|
||||
}
|
||||
|
||||
|
@@ -283,11 +283,11 @@ func formatNodes(nodes []tailcfg.NodeView) string {
|
||||
}
|
||||
fmt.Fprintf(&sb, "(%d, %q", n.ID(), n.Name())
|
||||
|
||||
if n.Online() != nil {
|
||||
fmt.Fprintf(&sb, ", online=%v", *n.Online())
|
||||
if online, ok := n.Online().GetOk(); ok {
|
||||
fmt.Fprintf(&sb, ", online=%v", online)
|
||||
}
|
||||
if n.LastSeen() != nil {
|
||||
fmt.Fprintf(&sb, ", lastSeen=%v", n.LastSeen().Unix())
|
||||
if lastSeen, ok := n.LastSeen().GetOk(); ok {
|
||||
fmt.Fprintf(&sb, ", lastSeen=%v", lastSeen.Unix())
|
||||
}
|
||||
if n.Key() != (key.NodePublic{}) {
|
||||
fmt.Fprintf(&sb, ", key=%v", n.Key().String())
|
||||
|
@@ -1117,13 +1117,9 @@ func (b *LocalBackend) UpdateStatus(sb *ipnstate.StatusBuilder) {
|
||||
}
|
||||
if !prefs.ExitNodeID().IsZero() {
|
||||
if exitPeer, ok := b.netMap.PeerWithStableID(prefs.ExitNodeID()); ok {
|
||||
online := false
|
||||
if v := exitPeer.Online(); v != nil {
|
||||
online = *v
|
||||
}
|
||||
s.ExitNodeStatus = &ipnstate.ExitNodeStatus{
|
||||
ID: prefs.ExitNodeID(),
|
||||
Online: online,
|
||||
Online: exitPeer.Online().Get(),
|
||||
TailscaleIPs: exitPeer.Addresses().AsSlice(),
|
||||
}
|
||||
}
|
||||
@@ -1194,10 +1190,6 @@ func (b *LocalBackend) populatePeerStatusLocked(sb *ipnstate.StatusBuilder) {
|
||||
}
|
||||
exitNodeID := b.pm.CurrentPrefs().ExitNodeID()
|
||||
for _, p := range b.peers {
|
||||
var lastSeen time.Time
|
||||
if p.LastSeen() != nil {
|
||||
lastSeen = *p.LastSeen()
|
||||
}
|
||||
tailscaleIPs := make([]netip.Addr, 0, p.Addresses().Len())
|
||||
for i := range p.Addresses().Len() {
|
||||
addr := p.Addresses().At(i)
|
||||
@@ -1205,7 +1197,6 @@ func (b *LocalBackend) populatePeerStatusLocked(sb *ipnstate.StatusBuilder) {
|
||||
tailscaleIPs = append(tailscaleIPs, addr.Addr())
|
||||
}
|
||||
}
|
||||
online := p.Online()
|
||||
ps := &ipnstate.PeerStatus{
|
||||
InNetworkMap: true,
|
||||
UserID: p.User(),
|
||||
@@ -1214,12 +1205,12 @@ func (b *LocalBackend) populatePeerStatusLocked(sb *ipnstate.StatusBuilder) {
|
||||
HostName: p.Hostinfo().Hostname(),
|
||||
DNSName: p.Name(),
|
||||
OS: p.Hostinfo().OS(),
|
||||
LastSeen: lastSeen,
|
||||
Online: online != nil && *online,
|
||||
LastSeen: p.LastSeen().Get(),
|
||||
Online: p.Online().Get(),
|
||||
ShareeNode: p.Hostinfo().ShareeNode(),
|
||||
ExitNode: p.StableID() != "" && p.StableID() == exitNodeID,
|
||||
SSH_HostKeys: p.Hostinfo().SSH_HostKeys().AsSlice(),
|
||||
Location: p.Hostinfo().Location(),
|
||||
Location: p.Hostinfo().Location().AsStruct(),
|
||||
Capabilities: p.Capabilities().AsSlice(),
|
||||
}
|
||||
if cm := p.CapMap(); cm.Len() > 0 {
|
||||
@@ -7369,8 +7360,8 @@ func suggestExitNode(report *netcheck.Report, netMap *netmap.NetworkMap, prevSug
|
||||
if len(candidates) == 1 {
|
||||
peer := candidates[0]
|
||||
if hi := peer.Hostinfo(); hi.Valid() {
|
||||
if loc := hi.Location(); loc != nil {
|
||||
res.Location = loc.View()
|
||||
if loc := hi.Location(); loc.Valid() {
|
||||
res.Location = loc
|
||||
}
|
||||
}
|
||||
res.ID = peer.StableID()
|
||||
@@ -7414,10 +7405,10 @@ func suggestExitNode(report *netcheck.Report, netMap *netmap.NetworkMap, prevSug
|
||||
continue
|
||||
}
|
||||
loc := hi.Location()
|
||||
if loc == nil {
|
||||
if !loc.Valid() {
|
||||
continue
|
||||
}
|
||||
distance := longLatDistance(preferredDERP.Latitude, preferredDERP.Longitude, loc.Latitude, loc.Longitude)
|
||||
distance := longLatDistance(preferredDERP.Latitude, preferredDERP.Longitude, loc.Latitude(), loc.Longitude())
|
||||
if distance < minDistance {
|
||||
minDistance = distance
|
||||
}
|
||||
@@ -7438,8 +7429,8 @@ func suggestExitNode(report *netcheck.Report, netMap *netmap.NetworkMap, prevSug
|
||||
res.ID = chosen.StableID()
|
||||
res.Name = chosen.Name()
|
||||
if hi := chosen.Hostinfo(); hi.Valid() {
|
||||
if loc := hi.Location(); loc != nil {
|
||||
res.Location = loc.View()
|
||||
if loc := hi.Location(); loc.Valid() {
|
||||
res.Location = loc
|
||||
}
|
||||
}
|
||||
return res, nil
|
||||
@@ -7468,8 +7459,8 @@ func suggestExitNode(report *netcheck.Report, netMap *netmap.NetworkMap, prevSug
|
||||
res.ID = chosen.StableID()
|
||||
res.Name = chosen.Name()
|
||||
if hi := chosen.Hostinfo(); hi.Valid() {
|
||||
if loc := hi.Location(); loc != nil {
|
||||
res.Location = loc.View()
|
||||
if loc := hi.Location(); loc.Valid() {
|
||||
res.Location = loc
|
||||
}
|
||||
}
|
||||
return res, nil
|
||||
@@ -7485,13 +7476,13 @@ func pickWeighted(candidates []tailcfg.NodeView) []tailcfg.NodeView {
|
||||
continue
|
||||
}
|
||||
loc := hi.Location()
|
||||
if loc == nil || loc.Priority < maxWeight {
|
||||
if !loc.Valid() || loc.Priority() < maxWeight {
|
||||
continue
|
||||
}
|
||||
if maxWeight != loc.Priority {
|
||||
if maxWeight != loc.Priority() {
|
||||
best = best[:0]
|
||||
}
|
||||
maxWeight = loc.Priority
|
||||
maxWeight = loc.Priority()
|
||||
best = append(best, c)
|
||||
}
|
||||
return best
|
||||
|
@@ -233,11 +233,11 @@ func (h *peerAPIHandler) logf(format string, a ...any) {
|
||||
// isAddressValid reports whether addr is a valid destination address for this
|
||||
// node originating from the peer.
|
||||
func (h *peerAPIHandler) isAddressValid(addr netip.Addr) bool {
|
||||
if v := h.peerNode.SelfNodeV4MasqAddrForThisPeer(); v != nil {
|
||||
return *v == addr
|
||||
if v, ok := h.peerNode.SelfNodeV4MasqAddrForThisPeer().GetOk(); ok {
|
||||
return v == addr
|
||||
}
|
||||
if v := h.peerNode.SelfNodeV6MasqAddrForThisPeer(); v != nil {
|
||||
return *v == addr
|
||||
if v, ok := h.peerNode.SelfNodeV6MasqAddrForThisPeer().GetOk(); ok {
|
||||
return v == addr
|
||||
}
|
||||
pfx := netip.PrefixFrom(addr, addr.BitLen())
|
||||
return views.SliceContains(h.selfNode.Addresses(), pfx)
|
||||
|
Reference in New Issue
Block a user