mirror of
https://github.com/tailscale/tailscale.git
synced 2025-01-05 14:57:49 +00:00
control/controlclient: wait for c1 to receive a netmap.
This strictly sequences things such that c1 is fully registered in the control server before c2 creates its poll. Failure to do this can cause an inversion where c2's poll finishes establishing before c1's poll starts, which results in c2 getting disconnected rather than c1, and the test times out waiting for c1 to get kicked. Fixes #98. Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
parent
cbb1e2e853
commit
66c7875974
@ -94,15 +94,24 @@ func TestClientsReusingKeys(t *testing.T) {
|
||||
// test. We're expecting it to block happily, invoking the no-op
|
||||
// update function periodically, then exit once c2 starts its own
|
||||
// poll below.
|
||||
gotNetmap := make(chan struct{}, 1)
|
||||
pollErrCh := make(chan error)
|
||||
go func() {
|
||||
pollErrCh <- c1.PollNetMap(ctx, -1, func(netMap *NetworkMap) {})
|
||||
pollErrCh <- c1.PollNetMap(ctx, -1, func(netMap *NetworkMap) {
|
||||
select {
|
||||
case gotNetmap <- struct{}{}:
|
||||
default:
|
||||
}
|
||||
})
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-gotNetmap:
|
||||
t.Logf("c1: received initial netmap")
|
||||
case err := <-pollErrCh:
|
||||
t.Fatal(err)
|
||||
default:
|
||||
case <-time.After(5 * time.Second):
|
||||
t.Fatal("c1 did not receive an initial netmap")
|
||||
}
|
||||
|
||||
// Connect c2, reusing c1's credentials. In other words, c2 *is*
|
||||
|
Loading…
x
Reference in New Issue
Block a user