mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Ensure proper serialization of updates and creates in federation test watcher
This commit is contained in:
parent
abd653bd97
commit
3540846fbe
@ -41,6 +41,8 @@ type WatcherDispatcher struct {
|
|||||||
sync.Mutex
|
sync.Mutex
|
||||||
watchers []*watch.RaceFreeFakeWatcher
|
watchers []*watch.RaceFreeFakeWatcher
|
||||||
eventsSoFar []*watch.Event
|
eventsSoFar []*watch.Event
|
||||||
|
orderExecution chan func()
|
||||||
|
stopChan chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wd *WatcherDispatcher) register(watcher *watch.RaceFreeFakeWatcher) {
|
func (wd *WatcherDispatcher) register(watcher *watch.RaceFreeFakeWatcher) {
|
||||||
@ -55,6 +57,7 @@ func (wd *WatcherDispatcher) register(watcher *watch.RaceFreeFakeWatcher) {
|
|||||||
func (wd *WatcherDispatcher) Stop() {
|
func (wd *WatcherDispatcher) Stop() {
|
||||||
wd.Lock()
|
wd.Lock()
|
||||||
defer wd.Unlock()
|
defer wd.Unlock()
|
||||||
|
close(wd.stopChan)
|
||||||
for _, watcher := range wd.watchers {
|
for _, watcher := range wd.watchers {
|
||||||
watcher.Stop()
|
watcher.Stop()
|
||||||
}
|
}
|
||||||
@ -138,7 +141,19 @@ func RegisterFakeWatch(resource string, client *core.Fake) *WatcherDispatcher {
|
|||||||
dispatcher := &WatcherDispatcher{
|
dispatcher := &WatcherDispatcher{
|
||||||
watchers: make([]*watch.RaceFreeFakeWatcher, 0),
|
watchers: make([]*watch.RaceFreeFakeWatcher, 0),
|
||||||
eventsSoFar: make([]*watch.Event, 0),
|
eventsSoFar: make([]*watch.Event, 0),
|
||||||
|
orderExecution: make(chan func()),
|
||||||
|
stopChan: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case fun := <-dispatcher.orderExecution:
|
||||||
|
fun()
|
||||||
|
case <-dispatcher.stopChan:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
client.AddWatchReactor(resource, func(action core.Action) (bool, watch.Interface, error) {
|
client.AddWatchReactor(resource, func(action core.Action) (bool, watch.Interface, error) {
|
||||||
watcher := watch.NewRaceFreeFake()
|
watcher := watch.NewRaceFreeFake()
|
||||||
@ -166,11 +181,11 @@ func RegisterFakeCopyOnCreate(resource string, client *core.Fake, watcher *Watch
|
|||||||
originalObj := createAction.GetObject()
|
originalObj := createAction.GetObject()
|
||||||
// Create a copy of the object here to prevent data races while reading the object in go routine.
|
// Create a copy of the object here to prevent data races while reading the object in go routine.
|
||||||
obj := copy(originalObj)
|
obj := copy(originalObj)
|
||||||
go func() {
|
watcher.orderExecution <- func() {
|
||||||
glog.V(4).Infof("Object created. Writing to channel: %v", obj)
|
glog.V(4).Infof("Object created. Writing to channel: %v", obj)
|
||||||
watcher.Add(obj)
|
watcher.Add(obj)
|
||||||
objChan <- obj
|
objChan <- obj
|
||||||
}()
|
}
|
||||||
return true, originalObj, nil
|
return true, originalObj, nil
|
||||||
})
|
})
|
||||||
return objChan
|
return objChan
|
||||||
@ -186,11 +201,11 @@ func RegisterFakeCopyOnUpdate(resource string, client *core.Fake, watcher *Watch
|
|||||||
originalObj := updateAction.GetObject()
|
originalObj := updateAction.GetObject()
|
||||||
// Create a copy of the object here to prevent data races while reading the object in go routine.
|
// Create a copy of the object here to prevent data races while reading the object in go routine.
|
||||||
obj := copy(originalObj)
|
obj := copy(originalObj)
|
||||||
go func() {
|
watcher.orderExecution <- func() {
|
||||||
glog.V(4).Infof("Object updated. Writing to channel: %v", obj)
|
glog.V(4).Infof("Object updated. Writing to channel: %v", obj)
|
||||||
watcher.Modify(obj)
|
watcher.Modify(obj)
|
||||||
objChan <- obj
|
objChan <- obj
|
||||||
}()
|
}
|
||||||
return true, originalObj, nil
|
return true, originalObj, nil
|
||||||
})
|
})
|
||||||
return objChan
|
return objChan
|
||||||
|
Loading…
Reference in New Issue
Block a user