Skip to content

Commit f5f0b77

Browse files
authored
Merge pull request moby#26719 from AkihiroSuda/fix-race-builder-vs-container-1
Fix a race found in TestBuildCancellationKillsSleep
2 parents 2f12d28 + ed2e79f commit f5f0b77

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

builder/dockerfile/internals.go

+16-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
"path/filepath"
1717
"sort"
1818
"strings"
19-
"sync"
2019
"time"
2120

2221
"github.com/Sirupsen/logrus"
@@ -524,10 +523,7 @@ func (b *Builder) run(cID string) (err error) {
524523
}()
525524

526525
finished := make(chan struct{})
527-
var once sync.Once
528-
finish := func() { close(finished) }
529526
cancelErrCh := make(chan error, 1)
530-
defer once.Do(finish)
531527
go func() {
532528
select {
533529
case <-b.clientCtx.Done():
@@ -541,22 +537,37 @@ func (b *Builder) run(cID string) (err error) {
541537
}()
542538

543539
if err := b.docker.ContainerStart(cID, nil, true, ""); err != nil {
540+
close(finished)
541+
if cancelErr := <-cancelErrCh; cancelErr != nil {
542+
logrus.Debugf("Build cancelled (%v) and got an error from ContainerStart: %v",
543+
cancelErr, err)
544+
}
544545
return err
545546
}
546547

547548
// Block on reading output from container, stop on err or chan closed
548549
if err := <-errCh; err != nil {
550+
close(finished)
551+
if cancelErr := <-cancelErrCh; cancelErr != nil {
552+
logrus.Debugf("Build cancelled (%v) and got an error from errCh: %v",
553+
cancelErr, err)
554+
}
549555
return err
550556
}
551557

552558
if ret, _ := b.docker.ContainerWait(cID, -1); ret != 0 {
559+
close(finished)
560+
if cancelErr := <-cancelErrCh; cancelErr != nil {
561+
logrus.Debugf("Build cancelled (%v) and got a non-zero code from ContainerWait: %d",
562+
cancelErr, ret)
563+
}
553564
// TODO: change error type, because jsonmessage.JSONError assumes HTTP
554565
return &jsonmessage.JSONError{
555566
Message: fmt.Sprintf("The command '%s' returned a non-zero code: %d", strings.Join(b.runConfig.Cmd, " "), ret),
556567
Code: ret,
557568
}
558569
}
559-
once.Do(finish)
570+
close(finished)
560571
return <-cancelErrCh
561572
}
562573

0 commit comments

Comments
 (0)