blob: 0ca707e981693a581e3eb0b96d470576a2e59dd9 [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: kubernetes
* Tag: Reproduce misbehavior
* Issue or PR : https://github.com/kubernetes/kubernetes/pull/58107
* Buggy version: 2f17d782eb2772d6401da7ddced9ac90656a7a79
* fix commit-id: 010a127314a935d8d038f8dd4559fc5b249813e4
* Flaky: 53/100
*/
package main
import (
"os"
"runtime"
"runtime/pprof"
"sync"
"time"
)
func init() {
register("Kubernetes58107", Kubernetes58107)
}
type RateLimitingInterface_kubernetes58107 interface {
Get()
Put()
}
type Type_kubernetes58107 struct {
cond *sync.Cond
}
func (q *Type_kubernetes58107) Get() {
q.cond.L.Lock()
defer q.cond.L.Unlock()
q.cond.Wait()
}
func (q *Type_kubernetes58107) Put() {
q.cond.Signal()
}
type ResourceQuotaController_kubernetes58107 struct {
workerLock sync.RWMutex
queue RateLimitingInterface_kubernetes58107
missingUsageQueue RateLimitingInterface_kubernetes58107
}
func (rq *ResourceQuotaController_kubernetes58107) worker(queue RateLimitingInterface_kubernetes58107, _ string) {
workFunc := func() bool {
rq.workerLock.RLock()
defer rq.workerLock.RUnlock()
queue.Get()
return true
}
for {
if quit := workFunc(); quit {
return
}
}
}
func (rq *ResourceQuotaController_kubernetes58107) Run() {
go rq.worker(rq.queue, "G1") // G3
go rq.worker(rq.missingUsageQueue, "G2") // G4
}
func (rq *ResourceQuotaController_kubernetes58107) Sync() {
for i := 0; i < 100000; i++ {
rq.workerLock.Lock()
runtime.Gosched()
rq.workerLock.Unlock()
}
}
func (rq *ResourceQuotaController_kubernetes58107) HelperSignals() {
for i := 0; i < 100000; i++ {
rq.queue.Put()
rq.missingUsageQueue.Put()
}
}
func startResourceQuotaController_kubernetes58107() {
resourceQuotaController := &ResourceQuotaController_kubernetes58107{
queue: &Type_kubernetes58107{sync.NewCond(&sync.Mutex{})},
missingUsageQueue: &Type_kubernetes58107{sync.NewCond(&sync.Mutex{})},
}
go resourceQuotaController.Run() // G2
go resourceQuotaController.Sync() // G5
resourceQuotaController.HelperSignals()
}
func Kubernetes58107() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(1000 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 1000; i++ {
go startResourceQuotaController_kubernetes58107() // G1
}
}