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