From d8205df17129f71057c6531cf1d82bd7770448bb Mon Sep 17 00:00:00 2001 From: Andy Goldstein Date: Wed, 1 Feb 2017 13:36:09 -0500 Subject: [PATCH] Make DeltaFIFO Resync atomic Make DeltaFIFO's Resync operation atomic, so it enqueues the entire queue before allowing adds/updates/deletes. --- .../k8s.io/client-go/tools/cache/delta_fifo.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/staging/src/k8s.io/client-go/tools/cache/delta_fifo.go b/staging/src/k8s.io/client-go/tools/cache/delta_fifo.go index b972f7ccc49..57969d8ea66 100644 --- a/staging/src/k8s.io/client-go/tools/cache/delta_fifo.go +++ b/staging/src/k8s.io/client-go/tools/cache/delta_fifo.go @@ -505,14 +505,12 @@ func (f *DeltaFIFO) Replace(list []interface{}, resourceVersion string) error { // Resync will send a sync event for each item func (f *DeltaFIFO) Resync() error { - var keys []string - func() { - f.lock.RLock() - defer f.lock.RUnlock() - keys = f.knownObjects.ListKeys() - }() + f.lock.Lock() + defer f.lock.Unlock() + + keys := f.knownObjects.ListKeys() for _, k := range keys { - if err := f.syncKey(k); err != nil { + if err := f.syncKeyLocked(k); err != nil { return err } } @@ -522,6 +520,11 @@ func (f *DeltaFIFO) Resync() error { func (f *DeltaFIFO) syncKey(key string) error { f.lock.Lock() defer f.lock.Unlock() + + return f.syncKeyLocked(key) +} + +func (f *DeltaFIFO) syncKeyLocked(key string) error { obj, exists, err := f.knownObjects.GetByKey(key) if err != nil { glog.Errorf("Unexpected error %v during lookup of key %v, unable to queue object for sync", err, key)