From 45ef4c7643041b517edaf567f1f827be8e7f060f Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Mon, 19 Sep 2016 19:01:44 +0000 Subject: [PATCH] Fix a race found in TestBuildCancellationKillsSleep Signed-off-by: Akihiro Suda Upstream-commit: ed2e79fc03cc78345675d208b3ace2c2fa688cb7 Component: engine --- .../engine/builder/dockerfile/internals.go | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/components/engine/builder/dockerfile/internals.go b/components/engine/builder/dockerfile/internals.go index f31d863012..150b9ddee7 100644 --- a/components/engine/builder/dockerfile/internals.go +++ b/components/engine/builder/dockerfile/internals.go @@ -16,7 +16,6 @@ import ( "path/filepath" "sort" "strings" - "sync" "time" "github.com/Sirupsen/logrus" @@ -523,10 +522,7 @@ func (b *Builder) run(cID string) (err error) { }() finished := make(chan struct{}) - var once sync.Once - finish := func() { close(finished) } cancelErrCh := make(chan error, 1) - defer once.Do(finish) go func() { select { case <-b.clientCtx.Done(): @@ -540,22 +536,37 @@ func (b *Builder) run(cID string) (err error) { }() if err := b.docker.ContainerStart(cID, nil, true, ""); err != nil { + close(finished) + if cancelErr := <-cancelErrCh; cancelErr != nil { + logrus.Debugf("Build cancelled (%v) and got an error from ContainerStart: %v", + cancelErr, err) + } return err } // Block on reading output from container, stop on err or chan closed if err := <-errCh; err != nil { + close(finished) + if cancelErr := <-cancelErrCh; cancelErr != nil { + logrus.Debugf("Build cancelled (%v) and got an error from errCh: %v", + cancelErr, err) + } return err } if ret, _ := b.docker.ContainerWait(cID, -1); ret != 0 { + close(finished) + if cancelErr := <-cancelErrCh; cancelErr != nil { + logrus.Debugf("Build cancelled (%v) and got a non-zero code from ContainerWait: %d", + cancelErr, ret) + } // TODO: change error type, because jsonmessage.JSONError assumes HTTP return &jsonmessage.JSONError{ Message: fmt.Sprintf("The command '%s' returned a non-zero code: %d", strings.Join(b.runConfig.Cmd, " "), ret), Code: ret, } } - once.Do(finish) + close(finished) return <-cancelErrCh }