Unverified 提交 e0f38fa3 作者: Whyrusleeping 提交者: GitHub

Merge pull request #4406 from ipfs/fix/4405

Fix two race conditions (and possibly go routine leaks) in commands
...@@ -342,6 +342,8 @@ You can now check what blocks have been created by: ...@@ -342,6 +342,8 @@ You can now check what blocks have been created by:
}, },
PostRun: map[cmds.EncodingType]func(cmds.Request, cmds.ResponseEmitter) cmds.ResponseEmitter{ PostRun: map[cmds.EncodingType]func(cmds.Request, cmds.ResponseEmitter) cmds.ResponseEmitter{
cmds.CLI: func(req cmds.Request, re cmds.ResponseEmitter) cmds.ResponseEmitter { cmds.CLI: func(req cmds.Request, re cmds.ResponseEmitter) cmds.ResponseEmitter {
ctx := req.Context()
reNext, res := cmds.NewChanResponsePair(req) reNext, res := cmds.NewChanResponsePair(req)
outChan := make(chan interface{}) outChan := make(chan interface{})
...@@ -429,9 +431,6 @@ You can now check what blocks have been created by: ...@@ -429,9 +431,6 @@ You can now check what blocks have been created by:
bar.ShowBar = true bar.ShowBar = true
bar.ShowTimeLeft = true bar.ShowTimeLeft = true
} }
case <-req.Context().Done():
re.SetError(req.Context().Err(), cmdkit.ErrNormal)
return
} }
} }
} }
...@@ -469,7 +468,12 @@ You can now check what blocks have been created by: ...@@ -469,7 +468,12 @@ You can now check what blocks have been created by:
return return
} }
outChan <- v select {
case outChan <- v:
case <-ctx.Done():
re.SetError(ctx.Err(), cmdkit.ErrNormal)
return
}
} }
}() }()
......
...@@ -90,15 +90,14 @@ var addPinCmd = &cmds.Command{ ...@@ -90,15 +90,14 @@ var addPinCmd = &cmds.Command{
v := new(dag.ProgressTracker) v := new(dag.ProgressTracker)
ctx := v.DeriveContext(req.Context()) ctx := v.DeriveContext(req.Context())
ch := make(chan []*cid.Cid) type pinResult struct {
pins []*cid.Cid
err error
}
ch := make(chan pinResult, 1)
go func() { go func() {
defer close(ch)
added, err := corerepo.Pin(n, ctx, req.Arguments(), recursive) added, err := corerepo.Pin(n, ctx, req.Arguments(), recursive)
if err != nil { ch <- pinResult{pins: added, err: err}
res.SetError(err, cmdkit.ErrNormal)
return
}
ch <- added
}() }()
ticker := time.NewTicker(500 * time.Millisecond) ticker := time.NewTicker(500 * time.Millisecond)
...@@ -106,16 +105,16 @@ var addPinCmd = &cmds.Command{ ...@@ -106,16 +105,16 @@ var addPinCmd = &cmds.Command{
defer close(out) defer close(out)
for { for {
select { select {
case val, ok := <-ch: case val := <-ch:
if !ok { if val.err != nil {
// error already set just return res.SetError(val.err, cmdkit.ErrNormal)
return return
} }
if pv := v.Value(); pv != 0 { if pv := v.Value(); pv != 0 {
out <- &AddPinOutput{Progress: v.Value()} out <- &AddPinOutput{Progress: v.Value()}
} }
out <- &AddPinOutput{Pins: cidsToStrings(val)} out <- &AddPinOutput{Pins: cidsToStrings(val.pins)}
return return
case <-ticker.C: case <-ticker.C:
out <- &AddPinOutput{Progress: v.Value()} out <- &AddPinOutput{Progress: v.Value()}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论