mirror of
https://github.com/tailscale/tailscale.git
synced 2025-12-05 09:21:36 +01:00
wgengine: make getStatus a bit cheaper (less alloc-y)
This removes one of the O(n=peers) allocs in getStatus, as Engine.getStatus happens more often than Reconfig. Updates #17814 Change-Id: I8a87fbebbecca3aedadba38e46cc418fd163c2b0 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
4c67df42f6
commit
fe5501a4e9
@ -145,7 +145,7 @@ type userspaceEngine struct {
|
|||||||
netMap *netmap.NetworkMap // or nil
|
netMap *netmap.NetworkMap // or nil
|
||||||
closing bool // Close was called (even if we're still closing)
|
closing bool // Close was called (even if we're still closing)
|
||||||
statusCallback StatusCallback
|
statusCallback StatusCallback
|
||||||
peerSequence []key.NodePublic
|
peerSequence views.Slice[key.NodePublic]
|
||||||
endpoints []tailcfg.Endpoint
|
endpoints []tailcfg.Endpoint
|
||||||
pendOpen map[flowtrackTuple]*pendingOpenFlow // see pendopen.go
|
pendOpen map[flowtrackTuple]*pendingOpenFlow // see pendopen.go
|
||||||
|
|
||||||
@ -939,12 +939,15 @@ func (e *userspaceEngine) Reconfig(cfg *wgcfg.Config, routerCfg *router.Config,
|
|||||||
e.tundev.SetWGConfig(cfg)
|
e.tundev.SetWGConfig(cfg)
|
||||||
|
|
||||||
peerSet := make(set.Set[key.NodePublic], len(cfg.Peers))
|
peerSet := make(set.Set[key.NodePublic], len(cfg.Peers))
|
||||||
|
|
||||||
e.mu.Lock()
|
e.mu.Lock()
|
||||||
e.peerSequence = e.peerSequence[:0]
|
seq := make([]key.NodePublic, 0, len(cfg.Peers))
|
||||||
for _, p := range cfg.Peers {
|
for _, p := range cfg.Peers {
|
||||||
e.peerSequence = append(e.peerSequence, p.PublicKey)
|
seq = append(seq, p.PublicKey)
|
||||||
peerSet.Add(p.PublicKey)
|
peerSet.Add(p.PublicKey)
|
||||||
}
|
}
|
||||||
|
e.peerSequence = views.SliceOf(seq)
|
||||||
|
|
||||||
nm := e.netMap
|
nm := e.netMap
|
||||||
e.mu.Unlock()
|
e.mu.Unlock()
|
||||||
|
|
||||||
@ -1199,7 +1202,7 @@ func (e *userspaceEngine) getStatus() (*Status, error) {
|
|||||||
|
|
||||||
e.mu.Lock()
|
e.mu.Lock()
|
||||||
closing := e.closing
|
closing := e.closing
|
||||||
peerKeys := slices.Clone(e.peerSequence)
|
peerKeys := e.peerSequence
|
||||||
localAddrs := slices.Clone(e.endpoints)
|
localAddrs := slices.Clone(e.endpoints)
|
||||||
e.mu.Unlock()
|
e.mu.Unlock()
|
||||||
|
|
||||||
@ -1207,8 +1210,8 @@ func (e *userspaceEngine) getStatus() (*Status, error) {
|
|||||||
return nil, ErrEngineClosing
|
return nil, ErrEngineClosing
|
||||||
}
|
}
|
||||||
|
|
||||||
peers := make([]ipnstate.PeerStatusLite, 0, len(peerKeys))
|
peers := make([]ipnstate.PeerStatusLite, 0, peerKeys.Len())
|
||||||
for _, key := range peerKeys {
|
for _, key := range peerKeys.All() {
|
||||||
if status, ok := e.getPeerStatusLite(key); ok {
|
if status, ok := e.getPeerStatusLite(key); ok {
|
||||||
peers = append(peers, status)
|
peers = append(peers, status)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user