// runReflectorUntil is equivalent to cache.Reflector.RunUntil, but it also logs // errors, which cache.Reflector.RunUntil simply ignores func runReflectorUntil(r *cache.Reflector, resyncPeriod time.Duration, stopCh <-chan struct{}) { loggingListAndWatch := func() { if err := r.ListAndWatch(stopCh); err != nil { log.Errorf("Kubernetes reflector: %v", err) } } go util.Until(loggingListAndWatch, resyncPeriod, stopCh) }
// Ensures given event queue is ready for watching new changes // and unblock other end of the ready channel func sendWatchReadiness(reflector *cache.Reflector, ready chan<- bool) { // timeout: 1min retries := 120 retryInterval := 500 * time.Millisecond // Try every retryInterval and bail-out if it exceeds max retries for i := 0; i < retries; i++ { // Reflector does list and watch of the resource // when listing of the resource is done, resourceVersion will be populated // and the event queue will be ready to watch any new changes version := reflector.LastSyncResourceVersion() if len(version) > 0 { ready <- true return } time.Sleep(retryInterval) } log.Fatalf("SDN event queue is not ready for watching new changes(timeout: 1min)") }