From: Michael Anthony Knyszek Date: Fri, 23 Apr 2021 18:11:52 +0000 (+0000) Subject: runtime: simplify TestSelectStackAdjust X-Git-Tag: go1.17beta1~456 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e7db792fc539603a61b89ae27104730a0a92c1e6;p=gostls13.git runtime: simplify TestSelectStackAdjust Currently this test attempts to trigger a concurrent GC in a very indirect way, but the way it does so is extremely error-prone. This test is virtually always prone to flaking based on test order. For example if the test that executed immediately before this one made a big heap but didn't clean it up, then this test could easily fail to trigger a GC. I was able to prove this with a small reproducer. This roundabout way of triggering a GC is also way overkill for this test. It just wants to get goroutines in a select and shrink their stacks. Every GC will schedule a stack for shrinking if it can. Replace all the complicated machinery with a single runtime.GC call. I've confirmed that the test consistently triggers a stack shrink, noting that both shrinkstack's copystack call is made and that syncadjustsudogs (the relevant function that's being indirectly tested) are both called. Fixes #44610. Change-Id: Ib1c091e0d1475bf6c596f56dc9b85eaea366fc73 Reviewed-on: https://go-review.googlesource.com/c/go/+/313109 Trust: Michael Knyszek Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Reviewed-by: Michael Pratt --- diff --git a/src/runtime/chan_test.go b/src/runtime/chan_test.go index 003d6a9fb3..c9ce3ac643 100644 --- a/src/runtime/chan_test.go +++ b/src/runtime/chan_test.go @@ -708,8 +708,6 @@ func TestSelectDuplicateChannel(t *testing.T) { c <- 8 // wake up B. This operation used to fail because c.recvq was corrupted (it tries to wake up an already running G instead of B) } -var selectSink interface{} - func TestSelectStackAdjust(t *testing.T) { // Test that channel receive slots that contain local stack // pointers are adjusted correctly by stack shrinking. @@ -766,20 +764,8 @@ func TestSelectStackAdjust(t *testing.T) { <-ready2 time.Sleep(10 * time.Millisecond) - // Force concurrent GC a few times. - var before, after runtime.MemStats - runtime.ReadMemStats(&before) - for i := 0; i < 100; i++ { - selectSink = new([1 << 20]byte) - runtime.ReadMemStats(&after) - if after.NumGC-before.NumGC >= 2 { - goto done - } - runtime.Gosched() - } - t.Fatal("failed to trigger concurrent GC") -done: - selectSink = nil + // Force concurrent GC to shrink the stacks. + runtime.GC() // Wake selects. close(d)