From 33385214bc1841eca19a4de9a9ecd7cac1e153ff Mon Sep 17 00:00:00 2001 From: wenlxie Date: Thu, 9 Mar 2017 20:57:15 +0800 Subject: [PATCH] recycle pod can't get the event since the channel been closed --- pkg/volume/util.go | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/pkg/volume/util.go b/pkg/volume/util.go index ec959e8c03b..5b625cdb9fa 100644 --- a/pkg/volume/util.go +++ b/pkg/volume/util.go @@ -97,7 +97,10 @@ func internalRecycleVolumeByWatchingPodUntilCompletion(pvName string, pod *v1.Po // Now only the old pod or the new pod run. Watch it until it finishes // and send all events on the pod to the PV for { - event := <-podCh + event, ok := <-podCh + if !ok { + return fmt.Errorf("recycler pod %q watch channel had been closed", pod.Name) + } switch event.Object.(type) { case *v1.Pod: // POD changed @@ -199,13 +202,14 @@ func (c *realRecyclerClient) WatchPod(name, namespace string, stopChannel chan s return nil, err } - eventCh := make(chan watch.Event, 0) + eventCh := make(chan watch.Event, 30) go func() { defer eventWatch.Stop() defer podWatch.Stop() defer close(eventCh) - + var podWatchChannelClosed bool + var eventWatchChannelClosed bool for { select { case _ = <-stopChannel: @@ -213,15 +217,19 @@ func (c *realRecyclerClient) WatchPod(name, namespace string, stopChannel chan s case podEvent, ok := <-podWatch.ResultChan(): if !ok { - return + podWatchChannelClosed = true + } else { + eventCh <- podEvent } - eventCh <- podEvent - case eventEvent, ok := <-eventWatch.ResultChan(): if !ok { - return + eventWatchChannelClosed = true + } else { + eventCh <- eventEvent } - eventCh <- eventEvent + } + if podWatchChannelClosed && eventWatchChannelClosed { + break } } }()