blob: 0d07ebc4a9c4513fda4583d3d0b908a32c164e43 [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: kubernetes
* Issue or PR : https://github.com/kubernetes/kubernetes/pull/62464
* Buggy version: a048ca888ad27367b1a7b7377c67658920adbf5d
* fix commit-id: c1b19fce903675b82e9fdd1befcc5f5d658bfe78
* Flaky: 8/100
*/
package main
import (
"math/rand"
"os"
"runtime"
"runtime/pprof"
"sync"
"time"
)
func init() {
register("Kubernetes62464", Kubernetes62464)
}
type State_kubernetes62464 interface {
GetCPUSetOrDefault()
GetCPUSet() bool
GetDefaultCPUSet()
SetDefaultCPUSet()
}
type stateMemory_kubernetes62464 struct {
sync.RWMutex
}
func (s *stateMemory_kubernetes62464) GetCPUSetOrDefault() {
s.RLock()
defer s.RUnlock()
if ok := s.GetCPUSet(); ok {
return
}
s.GetDefaultCPUSet()
}
func (s *stateMemory_kubernetes62464) GetCPUSet() bool {
runtime.Gosched()
s.RLock()
defer s.RUnlock()
if rand.Intn(10) > 5 {
return true
}
return false
}
func (s *stateMemory_kubernetes62464) GetDefaultCPUSet() {
s.RLock()
defer s.RUnlock()
}
func (s *stateMemory_kubernetes62464) SetDefaultCPUSet() {
s.Lock()
runtime.Gosched()
defer s.Unlock()
}
type staticPolicy_kubernetes62464 struct{}
func (p *staticPolicy_kubernetes62464) RemoveContainer(s State_kubernetes62464) {
s.GetDefaultCPUSet()
s.SetDefaultCPUSet()
}
type manager_kubernetes62464 struct {
state *stateMemory_kubernetes62464
}
func (m *manager_kubernetes62464) reconcileState() {
m.state.GetCPUSetOrDefault()
}
func NewPolicyAndManager_kubernetes62464() (*staticPolicy_kubernetes62464, *manager_kubernetes62464) {
s := &stateMemory_kubernetes62464{}
m := &manager_kubernetes62464{s}
p := &staticPolicy_kubernetes62464{}
return p, m
}
///
/// G1 G2
/// m.reconcileState()
/// m.state.GetCPUSetOrDefault()
/// s.RLock()
/// s.GetCPUSet()
/// p.RemoveContainer()
/// s.GetDefaultCPUSet()
/// s.SetDefaultCPUSet()
/// s.Lock()
/// s.RLock()
/// ---------------------G1,G2 deadlock---------------------
///
func Kubernetes62464() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 1000; i++ {
go func() {
p, m := NewPolicyAndManager_kubernetes62464()
go m.reconcileState()
go p.RemoveContainer(m.state)
}()
}
}