// 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) } }