Skip to content

Commit 4671e69

Browse files
authored
Merge pull request docker#10192 from AhmedGrati/10157-fix-goroutine-leak
Fix Goroutine leak in v2/command/formatter
2 parents d5d9f67 + 3a21e1e commit 4671e69

File tree

4 files changed

+24
-2
lines changed

4 files changed

+24
-2
lines changed

cmd/formatter/colors.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,14 @@ func rainbowColor() colorFunc {
9292
}
9393

9494
var loop = make(chan colorFunc)
95+
var quitChan = make(chan bool)
96+
97+
func cleanInfiniteGoroutine() {
98+
quitChan <- true
99+
}
95100

96101
func init() {
102+
defer cleanInfiniteGoroutine()
97103
colors := map[string]colorFunc{}
98104
for i, name := range names {
99105
colors[name] = makeColorFunc(strconv.Itoa(30 + i))
@@ -116,8 +122,14 @@ func init() {
116122
}
117123

118124
for {
119-
loop <- rainbow[i]
120-
i = (i + 1) % len(rainbow)
125+
select {
126+
case <-quitChan:
127+
return
128+
default:
129+
loop <- rainbow[i]
130+
i = (i + 1) % len(rainbow)
131+
}
121132
}
122133
}()
134+
123135
}

cmd/formatter/formatter_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"io"
2323
"testing"
2424

25+
"go.uber.org/goleak"
2526
"gotest.tools/v3/assert"
2627
)
2728

@@ -71,3 +72,8 @@ func TestPrint(t *testing.T) {
7172
{"Name":"myName2","Status":"myStatus2"}
7273
`)
7374
}
75+
76+
// Test the absence of unexpected goroutines.
77+
func TestColorsGoroutinesLeak(t *testing.T) {
78+
goleak.VerifyNone(t)
79+
}

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ require (
150150
sigs.k8s.io/yaml v1.2.0 // indirect
151151
)
152152

153+
require go.uber.org/goleak v1.1.12
154+
153155
replace (
154156
// Override for e2e tests
155157
github.com/cucumber/godog => github.com/laurazard/godog v0.0.0-20220922095256-4c4b17abdae7

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,7 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl
770770
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
771771
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
772772
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
773+
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
773774
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
774775
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
775776
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
@@ -978,6 +979,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
978979
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
979980
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
980981
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
982+
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
981983
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
982984
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
983985
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

0 commit comments

Comments
 (0)