diff options
| author | Josh Bleecher Snyder <josh@tailscale.com> | 2021-08-06 15:41:28 -0700 |
|---|---|---|
| committer | Josh Bleecher Snyder <josh@tailscale.com> | 2021-08-06 15:41:28 -0700 |
| commit | 74dccdf7a00670827b385b2ca6ffd4b6470b25b9 (patch) | |
| tree | 2768cc32456456ac5a90050926b2150c26769ef9 | |
| parent | 6a934639524bf1e54686d038f526bc2d0d40a71b (diff) | |
| download | tailscale-josh/opt-getstatus.tar.xz tailscale-josh/opt-getstatus.zip | |
optimize: calc size, use valuesjosh/opt-getstatus
| -rw-r--r-- | wgengine/userspace.go | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/wgengine/userspace.go b/wgengine/userspace.go index 5e237807f..f95288d67 100644 --- a/wgengine/userspace.go +++ b/wgengine/userspace.go @@ -946,8 +946,8 @@ func (e *userspaceEngine) getStatus() (*Status, error) { } func (e *userspaceEngine) getPeerStatusLite(br *bufio.Reader) ([]ipnstate.PeerStatusLite, error) { - pp := make(map[wgkey.Key]*ipnstate.PeerStatusLite) - p := &ipnstate.PeerStatusLite{} + pp := make(map[wgkey.Key]ipnstate.PeerStatusLite) + var p ipnstate.PeerStatusLite var hst1, hst2, n int64 @@ -972,11 +972,10 @@ func (e *userspaceEngine) getPeerStatusLite(br *bufio.Reader) ([]ipnstate.PeerSt if err != nil { return nil, fmt.Errorf("IpcGetOperation: invalid key in line %q", line) } - p = &ipnstate.PeerStatusLite{} - pp[wgkey.Key(pk)] = p - - key := tailcfg.NodeKey(pk) - p.NodeKey = key + if !p.NodeKey.IsZero() { + pp[wgkey.Key(p.NodeKey)] = p + } + p = ipnstate.PeerStatusLite{NodeKey: tailcfg.NodeKey(pk)} case "rx_bytes": n, err = mem.ParseInt(v, 10, 64) p.RxBytes = n @@ -1004,14 +1003,26 @@ func (e *userspaceEngine) getPeerStatusLite(br *bufio.Reader) ([]ipnstate.PeerSt } // else leave at time.IsZero() } } + if !p.NodeKey.IsZero() { + pp[wgkey.Key(p.NodeKey)] = p + } e.mu.Lock() defer e.mu.Unlock() - var peers []ipnstate.PeerStatusLite + // Do two passes, one to calculate size and the other to populate. + // This code is sensitive to allocations. + npeers := 0 + for _, pk := range e.peerSequence { + if _, ok := pp[pk]; ok { // ignore idle ones not in wireguard-go's config + npeers++ + } + } + + peers := make([]ipnstate.PeerStatusLite, 0, npeers) for _, pk := range e.peerSequence { if p, ok := pp[pk]; ok { // ignore idle ones not in wireguard-go's config - peers = append(peers, *p) + peers = append(peers, p) } } return peers, nil |
