mirror of
https://github.com/tailscale/tailscale.git
synced 2025-11-30 15:02:00 +01:00
We don't hold q.mu while running normal ExecQueue.Add funcs, so we shouldn't in RunSync either. Otherwise code it calls can't shut down the queue, as seen in #18502. Updates #18052 Co-authored-by: Nick Khyl <nickk@tailscale.com> Change-Id: Ic5e53440411eca5e9fabac7f4a68a9f6ef026de1 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
32 lines
607 B
Go
32 lines
607 B
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package execqueue
|
|
|
|
import (
|
|
"context"
|
|
"sync/atomic"
|
|
"testing"
|
|
)
|
|
|
|
func TestExecQueue(t *testing.T) {
|
|
ctx := context.Background()
|
|
var n atomic.Int32
|
|
q := &ExecQueue{}
|
|
defer q.Shutdown()
|
|
q.Add(func() { n.Add(1) })
|
|
q.Wait(ctx)
|
|
if got := n.Load(); got != 1 {
|
|
t.Errorf("n=%d; want 1", got)
|
|
}
|
|
}
|
|
|
|
// Test that RunSync doesn't hold q.mu and block Shutdown
|
|
// as we saw in tailscale/tailscale#18502
|
|
func TestExecQueueRunSyncLocking(t *testing.T) {
|
|
q := &ExecQueue{}
|
|
q.RunSync(t.Context(), func() {
|
|
q.Shutdown()
|
|
})
|
|
}
|