1
0
mirror of https://github.com/golang/go synced 2024-10-02 06:18:32 -06:00

runtime: even more TestStackGrowth timeout debugging

This adds logging for the expected duration of a growStack, plus
progress information on the growStack that timed out.

Updates #19381.

Change-Id: Ic358f8350f499ff22dd213b658aece7d1aa62675
Reviewed-on: https://go-review.googlesource.com/81556
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Austin Clements 2017-12-01 15:15:42 -05:00 committed by Brad Fitzpatrick
parent 088a9ad543
commit 2e5011d802

View File

@ -81,10 +81,13 @@ func TestStackGrowth(t *testing.T) {
var wg sync.WaitGroup var wg sync.WaitGroup
// in a normal goroutine // in a normal goroutine
var growDuration time.Duration // For debugging failures
wg.Add(1) wg.Add(1)
go func() { go func() {
defer wg.Done() defer wg.Done()
growStack() start := time.Now()
growStack(nil)
growDuration = time.Since(start)
}() }()
wg.Wait() wg.Wait()
@ -93,7 +96,7 @@ func TestStackGrowth(t *testing.T) {
go func() { go func() {
defer wg.Done() defer wg.Done()
LockOSThread() LockOSThread()
growStack() growStack(nil)
UnlockOSThread() UnlockOSThread()
}() }()
wg.Wait() wg.Wait()
@ -103,12 +106,14 @@ func TestStackGrowth(t *testing.T) {
go func() { go func() {
defer wg.Done() defer wg.Done()
done := make(chan bool) done := make(chan bool)
var started uint32 var startTime time.Time
var started, progress uint32
go func() { go func() {
s := new(string) s := new(string)
SetFinalizer(s, func(ss *string) { SetFinalizer(s, func(ss *string) {
startTime = time.Now()
atomic.StoreUint32(&started, 1) atomic.StoreUint32(&started, 1)
growStack() growStack(&progress)
done <- true done <- true
}) })
s = nil s = nil
@ -121,7 +126,10 @@ func TestStackGrowth(t *testing.T) {
case <-time.After(20 * time.Second): case <-time.After(20 * time.Second):
if atomic.LoadUint32(&started) == 0 { if atomic.LoadUint32(&started) == 0 {
t.Log("finalizer did not start") t.Log("finalizer did not start")
} else {
t.Logf("finalizer started %s ago and finished %d iterations", time.Since(startTime), atomic.LoadUint32(&progress))
} }
t.Log("first growStack took", growDuration)
t.Error("finalizer did not run") t.Error("finalizer did not run")
return return
} }
@ -134,7 +142,7 @@ func TestStackGrowth(t *testing.T) {
// growStack() // growStack()
//} //}
func growStack() { func growStack(progress *uint32) {
n := 1 << 10 n := 1 << 10
if testing.Short() { if testing.Short() {
n = 1 << 8 n = 1 << 8
@ -145,6 +153,9 @@ func growStack() {
if x != i+1 { if x != i+1 {
panic("stack is corrupted") panic("stack is corrupted")
} }
if progress != nil {
atomic.StoreUint32(progress, uint32(i))
}
} }
GC() GC()
} }
@ -234,7 +245,7 @@ func TestDeferPtrs(t *testing.T) {
} }
}() }()
defer set(&y, 42) defer set(&y, 42)
growStack() growStack(nil)
} }
type bigBuf [4 * 1024]byte type bigBuf [4 * 1024]byte