-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
tests: fix potential races with t.Parallel and loops ➿ #3493
tests: fix potential races with t.Parallel and loops ➿ #3493
Conversation
@@ -218,6 +218,7 @@ func TestExamples(t *testing.T) { | |||
|
|||
t.Parallel() | |||
for _, path := range getExamplePaths(t, baseDir) { | |||
path := path // capture range variable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thus is needed because exampleTest
called later.. does use t.Parallel()
Following the CommonMistake[1] in Go, for loop and go routines can be a big racey problem. This happens quite easily when using `t.Parallel` in for loop with tests. This fixes possible races by adding a "shadow" var that is evaluated at each iteration and placed on the stack for the goroutine, so each slice element is available to the goroutine when it is eventually executed. [1]: https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables Signed-off-by: Vincent Demeester <vdemeest@redhat.com>
3016975
to
0b4c0d9
Compare
i := i // capture range variable | ||
td := td // capture range variable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I often use i, td := i, td
to avoid the compounding pollution
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
😊
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/lgtm
(note that this might "fix" some flakey test — or might not 🧇) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
/lgtm
I wonder if we should have a note about this in a comment or in the reviewing guide to avoid falling back into this issue?
Yeah I am not sure where to put this 🙃 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks @vdemeester, nice catch 👍
and one other advantage of table driven test is to have them run in parallel, just realizing, we have not been using t.Parallel()
in our unit tests except one 😱
grep -r "t.Parallel()" ./pkg/
./pkg//reconciler/pipelinerun/resources/apply_test.go: t.Parallel()
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: pritidesai The full list of commands accepted by this bot can be found here. The pull request process is described here
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
Changes
Following the CommonMistake1 in Go, for loop and go routines can be
a big racey problem. This happens quite easily when using
t.Parallel
in for loop with tests.
This fixes possible races by adding a "shadow" var that is evaluated
at each iteration and placed on the stack for the goroutine, so each
slice element is available to the goroutine when it is eventually
executed.
Signed-off-by: Vincent Demeester vdemeest@redhat.com
/kind bug
/area testing
Submitter Checklist
These are the criteria that every PR should meet, please check them off as you
review them:
See the contribution guide for more details.
Double check this list of stuff that's easy to miss:
cmd
dir, please updatethe release Task to build and release this image.
Reviewer Notes
If API changes are included, additive changes must be approved by at least two OWNERS and backwards incompatible changes must be approved by more than 50% of the OWNERS, and they must first be added in a backwards compatible way.
Release Notes