mirror of
https://github.com/golang/go
synced 2024-11-11 22:20:22 -07:00
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 <mknyszek@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
b8fed48a9a
commit
e7db792fc5
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user