Browse code

Fix a race found in TestBuildCancellationKillsSleep

Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>

Akihiro Suda authored on 2016/09/20 04:01:44
Showing 1 changed files
... ...
@@ -16,7 +16,6 @@ import (
16 16
 	"path/filepath"
17 17
 	"sort"
18 18
 	"strings"
19
-	"sync"
20 19
 	"time"
21 20
 
22 21
 	"github.com/Sirupsen/logrus"
... ...
@@ -523,10 +522,7 @@ func (b *Builder) run(cID string) (err error) {
523 523
 	}()
524 524
 
525 525
 	finished := make(chan struct{})
526
-	var once sync.Once
527
-	finish := func() { close(finished) }
528 526
 	cancelErrCh := make(chan error, 1)
529
-	defer once.Do(finish)
530 527
 	go func() {
531 528
 		select {
532 529
 		case <-b.clientCtx.Done():
... ...
@@ -540,22 +536,37 @@ func (b *Builder) run(cID string) (err error) {
540 540
 	}()
541 541
 
542 542
 	if err := b.docker.ContainerStart(cID, nil, true, ""); err != nil {
543
+		close(finished)
544
+		if cancelErr := <-cancelErrCh; cancelErr != nil {
545
+			logrus.Debugf("Build cancelled (%v) and got an error from ContainerStart: %v",
546
+				cancelErr, err)
547
+		}
543 548
 		return err
544 549
 	}
545 550
 
546 551
 	// Block on reading output from container, stop on err or chan closed
547 552
 	if err := <-errCh; err != nil {
553
+		close(finished)
554
+		if cancelErr := <-cancelErrCh; cancelErr != nil {
555
+			logrus.Debugf("Build cancelled (%v) and got an error from errCh: %v",
556
+				cancelErr, err)
557
+		}
548 558
 		return err
549 559
 	}
550 560
 
551 561
 	if ret, _ := b.docker.ContainerWait(cID, -1); ret != 0 {
562
+		close(finished)
563
+		if cancelErr := <-cancelErrCh; cancelErr != nil {
564
+			logrus.Debugf("Build cancelled (%v) and got a non-zero code from ContainerWait: %d",
565
+				cancelErr, ret)
566
+		}
552 567
 		// TODO: change error type, because jsonmessage.JSONError assumes HTTP
553 568
 		return &jsonmessage.JSONError{
554 569
 			Message: fmt.Sprintf("The command '%s' returned a non-zero code: %d", strings.Join(b.runConfig.Cmd, " "), ret),
555 570
 			Code:    ret,
556 571
 		}
557 572
 	}
558
-	once.Do(finish)
573
+	close(finished)
559 574
 	return <-cancelErrCh
560 575
 }
561 576