Skip to content

Commit 294ab48

Browse files
committed
Fixed incorrect leak in kubernetes/13135
1 parent 0df2354 commit 294ab48

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

src/runtime/testdata/testgoroutineleakgc/kubernetes13135.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (w *WatchCache_kubernetes13135) Replace(obj interface{}) {
121121
}
122122
}
123123

124-
func NewCacher_kubernetes13135() *Cacher_kubernetes13135 {
124+
func NewCacher_kubernetes13135(stopCh <-chan struct{}) *Cacher_kubernetes13135 {
125125
watchCache := &WatchCache_kubernetes13135{}
126126
cacher := &Cacher_kubernetes13135{
127127
initialized: sync.WaitGroup{},
@@ -134,7 +134,6 @@ func NewCacher_kubernetes13135() *Cacher_kubernetes13135 {
134134
cacher.Unlock()
135135
})
136136
watchCache.SetOnEvent(cacher.processEvent)
137-
stopCh := StopChannel_kubernetes13135
138137
go Util_kubernetes13135(func() { cacher.startCaching(stopCh) }, 0, stopCh) // G2
139138
cacher.initialized.Wait()
140139
return cacher
@@ -166,6 +165,19 @@ func NewCacher_kubernetes13135() *Cacher_kubernetes13135 {
166165
///--------------------------------G2,G3 deadlock-------------------------------------
167166
///
168167

168+
///
169+
/// G1 G2 G3
170+
/// NewCacher()
171+
/// watchCache.SetOnReplace()
172+
/// watchCache.SetOnEvent()
173+
/// watchCache.initialized.Wait()
174+
/// Util(...)
175+
///
176+
/// cacher.startCaching()
177+
/// c.Lock()
178+
/// c.reflector.ListAndWatch()
179+
/// r.syncWith()
180+
///--------------------------------G1 deadlocks-------------------------------------
169181
func Kubernetes13135() {
170182
prof := pprof.Lookup("goroutineleak")
171183
defer func() {
@@ -176,10 +188,15 @@ func Kubernetes13135() {
176188
StopChannel_kubernetes13135 = make(chan struct{})
177189
for i := 0; i < 50; i++ {
178190
go func() {
191+
// Should create a local channel. Using a single global channel
192+
// concurrently will cause a deadlock which does not actually exist
193+
// in the original microbenchmark.
194+
StopChannel_kubernetes13135 := make(chan struct{})
195+
179196
// deadlocks: x > 0
180-
c := NewCacher_kubernetes13135() // G1
197+
c := NewCacher_kubernetes13135(StopChannel_kubernetes13135) // G1
181198
go c.watchCache.Add(nil) // G3
199+
go close(StopChannel_kubernetes13135)
182200
}()
183201
}
184-
go close(StopChannel_kubernetes13135)
185202
}

0 commit comments

Comments
 (0)