blob: 56467e0b56f7ccc1f6e0206ed5a7394023dc6f18 [file] [log] [blame]
// 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/28462
* Buggy version: b184bdabf7a01c4b802304ac64ac133743c484be
* fix commit-id: 89b123473774248fc3a0356dd3ce5b116cc69b29
* Flaky: 69/100
*/
package main
import (
"os"
"runtime"
"runtime/pprof"
"sync"
"time"
)
func init() {
register("Moby28462", Moby28462)
}
type State_moby28462 struct {
Health *Health_moby28462
}
type Container_moby28462 struct {
sync.Mutex
State *State_moby28462
}
func (ctr *Container_moby28462) start() {
go ctr.waitExit()
}
func (ctr *Container_moby28462) waitExit() {
}
type Store_moby28462 struct {
ctr *Container_moby28462
}
func (s *Store_moby28462) Get() *Container_moby28462 {
return s.ctr
}
type Daemon_moby28462 struct {
containers Store_moby28462
}
func (d *Daemon_moby28462) StateChanged() {
c := d.containers.Get()
c.Lock()
d.updateHealthMonitorElseBranch(c)
defer c.Unlock()
}
func (d *Daemon_moby28462) updateHealthMonitorIfBranch(c *Container_moby28462) {
h := c.State.Health
if stop := h.OpenMonitorChannel(); stop != nil {
go monitor_moby28462(c, stop)
}
}
func (d *Daemon_moby28462) updateHealthMonitorElseBranch(c *Container_moby28462) {
h := c.State.Health
h.CloseMonitorChannel()
}
type Health_moby28462 struct {
stop chan struct{}
}
func (s *Health_moby28462) OpenMonitorChannel() chan struct{} {
return s.stop
}
func (s *Health_moby28462) CloseMonitorChannel() {
if s.stop != nil {
s.stop <- struct{}{}
}
}
func monitor_moby28462(c *Container_moby28462, stop chan struct{}) {
for {
select {
case <-stop:
return
default:
handleProbeResult_moby28462(c)
}
}
}
func handleProbeResult_moby28462(c *Container_moby28462) {
runtime.Gosched()
c.Lock()
defer c.Unlock()
}
func NewDaemonAndContainer_moby28462() (*Daemon_moby28462, *Container_moby28462) {
c := &Container_moby28462{
State: &State_moby28462{&Health_moby28462{make(chan struct{})}},
}
d := &Daemon_moby28462{Store_moby28462{c}}
return d, c
}
func Moby28462() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 100; i++ {
go func() {
d, c := NewDaemonAndContainer_moby28462()
go monitor_moby28462(c, c.State.Health.OpenMonitorChannel()) // G1
go d.StateChanged() // G2
}()
}
}