Skip to content

Commit 5012c6a

Browse files
committed
fix concurrent SetError in pin command
(segfault) Also, buffer the response channel. I believe we had a go routine leak here before. License: MIT Signed-off-by: Steven Allen <[email protected]>
1 parent a62eb62 commit 5012c6a

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

core/commands/pin.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,32 +90,31 @@ var addPinCmd = &cmds.Command{
9090
v := new(dag.ProgressTracker)
9191
ctx := v.DeriveContext(req.Context())
9292

93-
ch := make(chan []*cid.Cid)
93+
type pinResult struct {
94+
pins []*cid.Cid
95+
err error
96+
}
97+
ch := make(chan pinResult, 1)
9498
go func() {
95-
defer close(ch)
9699
added, err := corerepo.Pin(n, ctx, req.Arguments(), recursive)
97-
if err != nil {
98-
res.SetError(err, cmdkit.ErrNormal)
99-
return
100-
}
101-
ch <- added
100+
ch <- pinResult{pins: added, err: err}
102101
}()
103102

104103
ticker := time.NewTicker(500 * time.Millisecond)
105104
defer ticker.Stop()
106105
defer close(out)
107106
for {
108107
select {
109-
case val, ok := <-ch:
110-
if !ok {
111-
// error already set just return
108+
case val := <-ch:
109+
if val.err != nil {
110+
res.SetError(err, cmdkit.ErrNormal)
112111
return
113112
}
114113

115114
if pv := v.Value(); pv != 0 {
116115
out <- &AddPinOutput{Progress: v.Value()}
117116
}
118-
out <- &AddPinOutput{Pins: cidsToStrings(val)}
117+
out <- &AddPinOutput{Pins: cidsToStrings(val.pins)}
119118
return
120119
case <-ticker.C:
121120
out <- &AddPinOutput{Progress: v.Value()}

0 commit comments

Comments
 (0)