tailscale/types/lazy
Nick Khyl f023c8603a types/lazy: fix flaky TestDeferAfterDo
This test verifies, among other things, that init functions cannot be deferred after (*DeferredFuncs).Do
has already been called and that all subsequent calls to (*DeferredFuncs).Defer return false.

However, the initial implementation of this check was racy: by the time (*DeferredFuncs).Do returned,
not all goroutines that successfully deferred an init function may have incremented the atomic variable
tracking the number of deferred functions. As a result, the variable's value could differ immediately
after (*DeferredFuncs).Do returned and after all goroutines had completed execution (i.e., after wg.Wait()).

In this PR, we replace the original racy check with a different one. Although this new check is also racy,
it can only produce false negatives. This means that if the test fails, it indicates an actual bug rather than
a flaky test.

Fixes #14039

Signed-off-by: Nick Khyl <nickk@tailscale.com>
2025-01-15 15:38:51 -06:00
..
deferred_test.go types/lazy: fix flaky TestDeferAfterDo 2025-01-15 15:38:51 -06:00
deferred.go types/lazy: fix flaky TestDeferAfterDo 2025-01-15 15:38:51 -06:00
lazy.go util/uniq,types/lazy,*: delete code that's now in Go std 2025-01-12 19:49:02 -08:00
sync_test.go util/uniq,types/lazy,*: delete code that's now in Go std 2025-01-12 19:49:02 -08:00
unsync_test.go types/lazy: helpers for lazily computed values 2023-02-10 20:59:58 -08:00
unsync.go types/lazy: helpers for lazily computed values 2023-02-10 20:59:58 -08:00