浏览代码

Improve select for daemon restart tests

This improves the select logic for the restart tests or starting the
daemon in general.  With the way the ticker and select was setup, it was
possible for only the timeout to be displayed and not the wait errors.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
(cherry picked from commit 402433a5e4b8a74cab404658f34e6520e71df00a)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Michael Crosby 6 年之前
父节点
当前提交
78f4d6b84f
共有 1 个文件被更改,包括 14 次插入15 次删除
  1. 14 15
      internal/test/daemon/daemon.go

+ 14 - 15
internal/test/daemon/daemon.go

@@ -281,7 +281,7 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error {
 		return errors.Errorf("[%s] could not start daemon container: %v", d.id, err)
 		return errors.Errorf("[%s] could not start daemon container: %v", d.id, err)
 	}
 	}
 
 
-	wait := make(chan error)
+	wait := make(chan error, 1)
 
 
 	go func() {
 	go func() {
 		ret := d.cmd.Wait()
 		ret := d.cmd.Wait()
@@ -309,26 +309,27 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error {
 	req.URL.Host = clientConfig.addr
 	req.URL.Host = clientConfig.addr
 	req.URL.Scheme = clientConfig.scheme
 	req.URL.Scheme = clientConfig.scheme
 
 
-	ticker := time.NewTicker(500 * time.Millisecond)
-	defer ticker.Stop()
-	tick := ticker.C
-
-	timeout := time.NewTimer(60 * time.Second) // timeout for the whole loop
-	defer timeout.Stop()
+	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+	defer cancel()
 
 
 	// make sure daemon is ready to receive requests
 	// make sure daemon is ready to receive requests
 	for {
 	for {
 		d.log.Logf("[%s] waiting for daemon to start", d.id)
 		d.log.Logf("[%s] waiting for daemon to start", d.id)
 
 
 		select {
 		select {
-		case <-timeout.C:
-			return errors.Errorf("[%s] Daemon exited and never started", d.id)
-		case <-tick:
-			ctx, cancel := context.WithTimeout(context.TODO(), 2*time.Second)
-			resp, err := client.Do(req.WithContext(ctx))
-			cancel()
+		case <-ctx.Done():
+			return errors.Errorf("[%s] Daemon exited and never started: %s", d.id, ctx.Err())
+		case err := <-d.Wait:
+			return errors.Errorf("[%s] Daemon exited during startup: %v", d.id, err)
+		default:
+			rctx, rcancel := context.WithTimeout(context.TODO(), 2*time.Second)
+			defer rcancel()
+
+			resp, err := client.Do(req.WithContext(rctx))
 			if err != nil {
 			if err != nil {
 				d.log.Logf("[%s] error pinging daemon on start: %v", d.id, err)
 				d.log.Logf("[%s] error pinging daemon on start: %v", d.id, err)
+
+				time.Sleep(500 * time.Millisecond)
 				continue
 				continue
 			}
 			}
 
 
@@ -342,8 +343,6 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error {
 				return errors.Errorf("[%s] error querying daemon for root directory: %v", d.id, err)
 				return errors.Errorf("[%s] error querying daemon for root directory: %v", d.id, err)
 			}
 			}
 			return nil
 			return nil
-		case err := <-d.Wait:
-			return errors.Errorf("[%s] Daemon exited during startup: %v", d.id, err)
 		}
 		}
 	}
 	}
 }
 }