From 78730a2b96d2dc9ffd397e8cd4e5dd62ce742617 Mon Sep 17 00:00:00 2001 From: lynxcat Date: Thu, 6 Jan 2022 09:45:02 +0800 Subject: [PATCH] use wait.Poll to watch pod status Signed-off-by: lynxcat --- pkg/models/terminal/terminal.go | 39 ++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/pkg/models/terminal/terminal.go b/pkg/models/terminal/terminal.go index d02c623c4..c829f4396 100644 --- a/pkg/models/terminal/terminal.go +++ b/pkg/models/terminal/terminal.go @@ -25,6 +25,7 @@ import ( "encoding/json" "fmt" "io" + "k8s.io/apimachinery/pkg/util/wait" "strconv" "sync" "sync/atomic" @@ -189,7 +190,7 @@ func NewNodeTerminaler(nodename string, options *Options, client kubernetes.Inte node, err := n.client.CoreV1().Nodes().Get(context.Background(), n.Nodename, metav1.GetOptions{}) if err != nil { - return n, fmt.Errorf("node cannot exist. nodename:%s, err: %v", n.Nodename, err) + return n, fmt.Errorf("getting node error. nodename:%s, err: %v", n.Nodename, err) } flag := false @@ -378,21 +379,33 @@ func (t *terminaler) HandleShellAccessToNode(nodename string, conn *websocket.Co } func (n *NodeTerminaler) WatchPodStatusBeRunning(pod *v1.Pod, succ chan bool, fail chan bool) { - var err error - for i := 0; i < 5; i++ { - if pod.Status.Phase == v1.PodRunning { - idx, _ := NodeSessionCounter.Load(n.Nodename) - atomic.AddInt64(idx.(*int64), 1) - close(succ) - return - } - time.Sleep(time.Second) + if pod.Status.Phase == v1.PodRunning { + idx, _ := NodeSessionCounter.Load(n.Nodename) + atomic.AddInt64(idx.(*int64), 1) + close(succ) + return + } + + err := wait.Poll(time.Millisecond*500, time.Second*5, func() (done bool, err error) { pod, err = n.client.CoreV1().Pods(pod.ObjectMeta.Namespace).Get(context.Background(), pod.ObjectMeta.Name, metav1.GetOptions{}) if err != nil { klog.Warning(err) - close(fail) - return + return false, err } + + if pod.Status.Phase == v1.PodRunning { + idx, _ := NodeSessionCounter.Load(n.Nodename) + atomic.AddInt64(idx.(*int64), 1) + return true, nil + } + + return false, nil + }) + + if err != nil { + klog.Warning("watching pod status error: ", err) + close(fail) + } else { + close(succ) } - close(fail) }