blob: 4be50546e9be2c72edf3d5f64c8ad283438e43d7 [file] [log] [blame] [edit]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a MIT
// license that can be found in the LICENSE file.
/*
* Project: moby
* Issue or PR : https://github.com/moby/moby/pull/33781
* Buggy version: 33fd3817b0f5ca4b87f0a75c2bd583b4425d392b
* fix commit-id: 67297ba0051d39be544009ba76abea14bc0be8a4
* Flaky: 25/100
*/
package main
import (
"context"
"os"
"runtime/pprof"
"time"
)
func init() {
register("Moby33781", Moby33781)
}
func monitor_moby33781(stop chan bool) {
probeInterval := time.Millisecond
probeTimeout := time.Millisecond
for {
select {
case <-stop:
return
case <-time.After(probeInterval):
results := make(chan bool)
ctx, cancelProbe := context.WithTimeout(context.Background(), probeTimeout)
go func() { // G3
results <- true
close(results)
}()
select {
case <-stop:
// results should be drained here
cancelProbe()
return
case <-results:
cancelProbe()
case <-ctx.Done():
cancelProbe()
<-results
}
}
}
}
func Moby33781() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 100; i++ {
go func(i int) {
stop := make(chan bool)
go monitor_moby33781(stop) // G1
go func() { // G2
time.Sleep(time.Duration(i) * time.Millisecond)
stop <- true
}()
}(i)
}
}