func (p *podWorkers) managePodLoop(podUpdates <-chan workUpdate) { var minRuntimeCacheTime time.Time for newWork := range podUpdates { func() { defer p.checkForUpdates(newWork.pod.UID, newWork.updateCompleteFn) // We would like to have the state of the containers from at least // the moment when we finished the previous processing of that pod. if err := p.runtimeCache.ForceUpdateIfOlder(minRuntimeCacheTime); err != nil { glog.Errorf("Error updating the container runtime cache: %v", err) return } pods, err := p.runtimeCache.GetPods() if err != nil { glog.Errorf("Error getting pods while syncing pod: %v", err) return } err = p.syncPodFn(newWork.pod, newWork.mirrorPod, kubecontainer.Pods(pods).FindPodByID(newWork.pod.UID), newWork.updateType) if err != nil { glog.Errorf("Error syncing pod %s, skipping: %v", newWork.pod.UID, err) p.recorder.Eventf(newWork.pod, "FailedSync", "Error syncing pod, skipping: %v", err) return } minRuntimeCacheTime = time.Now() newWork.updateCompleteFn() }() } }
func (f *fakePodWorkers) UpdatePod(pod *api.Pod, mirrorPod *api.Pod, updateComplete func()) { pods, err := f.runtimeCache.GetPods() if err != nil { f.t.Errorf("Unexpected error: %v", err) } if err := f.syncPodFn(pod, mirrorPod, kubecontainer.Pods(pods).FindPodByID(pod.UID), SyncPodUpdate); err != nil { f.t.Errorf("Unexpected error: %v", err) } }
// runPod runs a single pod and wait until all containers are running. func (kl *Kubelet) runPod(pod *api.Pod, retryDelay time.Duration) error { delay := retryDelay retry := 0 for { pods, err := kl.containerRuntime.GetPods(false) if err != nil { return fmt.Errorf("failed to get kubelet pods: %v", err) } p := container.Pods(pods).FindPodByID(pod.UID) running, err := kl.isPodRunning(pod, p) if err != nil { return fmt.Errorf("failed to check pod status: %v", err) } if running { glog.Infof("pod %q containers running", pod.Name) return nil } glog.Infof("pod %q containers not running: syncing", pod.Name) podFullName := kubecontainer.GetPodFullName(pod) glog.Infof("Creating a mirror pod for static pod %q", podFullName) if err := kl.podManager.CreateMirrorPod(pod); err != nil { glog.Errorf("Failed creating a mirror pod %q: %v", podFullName, err) } mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) if err = kl.syncPod(pod, mirrorPod, p, SyncPodUpdate); err != nil { return fmt.Errorf("error syncing pod: %v", err) } if retry >= RunOnceMaxRetries { return fmt.Errorf("timeout error: pod %q containers not running after %d retries", pod.Name, RunOnceMaxRetries) } // TODO(proppy): health checking would be better than waiting + checking the state at the next iteration. glog.Infof("pod %q containers synced, waiting for %v", pod.Name, delay) time.Sleep(delay) retry++ delay *= RunOnceRetryDelayBackoff } }