mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-12 13:31:52 +00:00
Merge pull request #121615 from p0lyn0mial/upstream-cacher-forget-watcher
cacher: when forgeting a watcher, call stopWatcherLocked multiple times
This commit is contained in:
commit
5bac451d1f
@ -112,11 +112,8 @@ func (wm watchersMap) addWatcher(w *cacheWatcher, number int) {
|
|||||||
wm[number] = w
|
wm[number] = w
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wm watchersMap) deleteWatcher(number int, done func(*cacheWatcher)) {
|
func (wm watchersMap) deleteWatcher(number int) {
|
||||||
if watcher, ok := wm[number]; ok {
|
delete(wm, number)
|
||||||
delete(wm, number)
|
|
||||||
done(watcher)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wm watchersMap) terminateAll(done func(*cacheWatcher)) {
|
func (wm watchersMap) terminateAll(done func(*cacheWatcher)) {
|
||||||
@ -147,14 +144,14 @@ func (i *indexedWatchers) addWatcher(w *cacheWatcher, number int, scope namespac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *indexedWatchers) deleteWatcher(number int, scope namespacedName, value string, supported bool, done func(*cacheWatcher)) {
|
func (i *indexedWatchers) deleteWatcher(number int, scope namespacedName, value string, supported bool) {
|
||||||
if supported {
|
if supported {
|
||||||
i.valueWatchers[value].deleteWatcher(number, done)
|
i.valueWatchers[value].deleteWatcher(number)
|
||||||
if len(i.valueWatchers[value]) == 0 {
|
if len(i.valueWatchers[value]) == 0 {
|
||||||
delete(i.valueWatchers, value)
|
delete(i.valueWatchers, value)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
i.allWatchers[scope].deleteWatcher(number, done)
|
i.allWatchers[scope].deleteWatcher(number)
|
||||||
if len(i.allWatchers[scope]) == 0 {
|
if len(i.allWatchers[scope]) == 0 {
|
||||||
delete(i.allWatchers, scope)
|
delete(i.allWatchers, scope)
|
||||||
}
|
}
|
||||||
@ -1223,7 +1220,8 @@ func forgetWatcher(c *Cacher, w *cacheWatcher, index int, scope namespacedName,
|
|||||||
// It's possible that the watcher is already not in the structure (e.g. in case of
|
// It's possible that the watcher is already not in the structure (e.g. in case of
|
||||||
// simultaneous Stop() and terminateAllWatchers(), but it is safe to call stopLocked()
|
// simultaneous Stop() and terminateAllWatchers(), but it is safe to call stopLocked()
|
||||||
// on a watcher multiple times.
|
// on a watcher multiple times.
|
||||||
c.watchers.deleteWatcher(index, scope, triggerValue, triggerSupported, c.stopWatcherLocked)
|
c.watchers.deleteWatcher(index, scope, triggerValue, triggerSupported)
|
||||||
|
c.stopWatcherLocked(w)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ import (
|
|||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
"k8s.io/utils/clock"
|
"k8s.io/utils/clock"
|
||||||
|
testingclock "k8s.io/utils/clock/testing"
|
||||||
"k8s.io/utils/pointer"
|
"k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -1807,3 +1808,45 @@ func TestDoNotPopExpiredWatchersWhenNoEventsSeen(t *testing.T) {
|
|||||||
}},
|
}},
|
||||||
}, true)
|
}, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestForgetWatcher(t *testing.T) {
|
||||||
|
backingStorage := &dummyStorage{}
|
||||||
|
cacher, _, err := newTestCacher(backingStorage)
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer cacher.Stop()
|
||||||
|
|
||||||
|
require.Equal(t, 0, len(cacher.watchers.allWatchers))
|
||||||
|
require.Equal(t, 0, len(cacher.watchers.valueWatchers))
|
||||||
|
|
||||||
|
var forgetWatcherFn func(bool)
|
||||||
|
var forgetCounter int
|
||||||
|
forgetWatcherWrapped := func(drainWatcher bool) {
|
||||||
|
forgetCounter++
|
||||||
|
forgetWatcherFn(drainWatcher)
|
||||||
|
}
|
||||||
|
w := newCacheWatcher(
|
||||||
|
0,
|
||||||
|
func(_ string, _ labels.Set, _ fields.Set) bool { return true },
|
||||||
|
nil,
|
||||||
|
storage.APIObjectVersioner{},
|
||||||
|
testingclock.NewFakeClock(time.Now()).Now().Add(2*time.Minute),
|
||||||
|
true,
|
||||||
|
schema.GroupResource{Resource: "pods"},
|
||||||
|
"1",
|
||||||
|
)
|
||||||
|
forgetWatcherFn = forgetWatcher(cacher, w, 0, namespacedName{}, "", false)
|
||||||
|
|
||||||
|
cacher.watchers.addWatcher(w, 0, namespacedName{}, "", false)
|
||||||
|
require.Equal(t, 0, len(cacher.watchers.valueWatchers))
|
||||||
|
require.Equal(t, 1, len(cacher.watchers.allWatchers))
|
||||||
|
|
||||||
|
forgetWatcherWrapped(false)
|
||||||
|
require.Equal(t, 0, len(cacher.watchers.allWatchers))
|
||||||
|
require.Equal(t, 0, len(cacher.watchers.valueWatchers))
|
||||||
|
require.Equal(t, 1, forgetCounter)
|
||||||
|
|
||||||
|
forgetWatcherWrapped(false)
|
||||||
|
require.Equal(t, 0, len(cacher.watchers.allWatchers))
|
||||||
|
require.Equal(t, 0, len(cacher.watchers.valueWatchers))
|
||||||
|
require.Equal(t, 2, forgetCounter)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user