diff --git a/go.mod b/go.mod index 90c2c735f5058..988f487591b84 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ replace github.com/tcnksm/go-httpstat => github.com/kylecarbs/go-httpstat v0.0.0 // There are a few minor changes we make to Tailscale that we're slowly upstreaming. Compare here: // https://github.com/tailscale/tailscale/compare/main...coder:tailscale:main -replace tailscale.com => github.com/coder/tailscale v1.1.1-0.20220907140144-9abacd14802f +replace tailscale.com => github.com/coder/tailscale v1.1.1-0.20220907193453-fb5ba5ab658d require ( cdr.dev/slog v1.4.2-0.20220525200111-18dce5c2cd5f diff --git a/go.sum b/go.sum index 310ff8b4f143c..0987a4ea34e01 100644 --- a/go.sum +++ b/go.sum @@ -352,8 +352,8 @@ github.com/coder/glog v1.0.1-0.20220322161911-7365fe7f2cd1 h1:UqBrPWSYvRI2s5RtOu github.com/coder/glog v1.0.1-0.20220322161911-7365fe7f2cd1/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/coder/retry v1.3.0 h1:5lAAwt/2Cm6lVmnfBY7sOMXcBOwcwJhmV5QGSELIVWY= github.com/coder/retry v1.3.0/go.mod h1:tXuRgZgWjUnU5LZPT4lJh4ew2elUhexhlnXzrJWdyFY= -github.com/coder/tailscale v1.1.1-0.20220907140144-9abacd14802f h1:iWOlTwTwh1hCr6I0D2bWFHKRaPb7PmcxPISFkkj3DdM= -github.com/coder/tailscale v1.1.1-0.20220907140144-9abacd14802f/go.mod h1:MO+tWkQp2YIF3KBnnej/mQvgYccRS5Xk/IrEpZ4Z3BU= +github.com/coder/tailscale v1.1.1-0.20220907193453-fb5ba5ab658d h1:IQ8wJn8MfDS+sesYPpn3EDAyvoGMxFvyyE9uWtcfU6w= +github.com/coder/tailscale v1.1.1-0.20220907193453-fb5ba5ab658d/go.mod h1:MO+tWkQp2YIF3KBnnej/mQvgYccRS5Xk/IrEpZ4Z3BU= github.com/coder/wireguard-go/tun/netstack v0.0.0-20220823170024-a78136eb0cab h1:9yEvRWXXfyKzXu8AqywCi+tFZAoqCy4wVcsXwuvZNMc= github.com/coder/wireguard-go/tun/netstack v0.0.0-20220823170024-a78136eb0cab/go.mod h1:TCJ66NtXh3urJotTdoYQOHHkyE899vOQl5TuF+WLSes= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= diff --git a/tailnet/conn.go b/tailnet/conn.go index 0640c69a5853c..9e5134e4d6071 100644 --- a/tailnet/conn.go +++ b/tailnet/conn.go @@ -260,29 +260,38 @@ func (c *Conn) SetNodeCallback(callback func(node *Node)) { DERPLatency: c.lastDERPLatency, } } + // A send queue must be used so nodes are sent in order. + queue := make(chan *Node, 16) + go func() { + for { + select { + case <-c.closed: + return + case node := <-queue: + callback(node) + } + } + }() c.wireguardEngine.SetNetInfoCallback(func(ni *tailcfg.NetInfo) { c.lastMutex.Lock() c.lastPreferredDERP = ni.PreferredDERP c.lastDERPLatency = ni.DERPLatency node := makeNode() + queue <- node c.lastMutex.Unlock() - callback(node) }) c.wireguardEngine.SetStatusCallback(func(s *wgengine.Status, err error) { if err != nil { return } - endpoints := make([]string, 0, len(s.LocalAddrs)) + c.lastMutex.Lock() + c.lastEndpoints = make([]string, 0, len(s.LocalAddrs)) for _, addr := range s.LocalAddrs { - endpoints = append(endpoints, addr.Addr.String()) + c.lastEndpoints = append(c.lastEndpoints, addr.Addr.String()) } - go func() { - c.lastMutex.Lock() - c.lastEndpoints = endpoints - node := makeNode() - c.lastMutex.Unlock() - callback(node) - }() + node := makeNode() + queue <- node + c.lastMutex.Unlock() }) }