提交 2c2bcb8a 作者: Juan Batiz-Benet

Merge pull request #909 from kkoroviev/fix-daemon-races

Dirty hack to fix race conditions in the daemon
...@@ -267,6 +267,10 @@ func daemonFunc(req cmds.Request, res cmds.Response) { ...@@ -267,6 +267,10 @@ func daemonFunc(req cmds.Request, res cmds.Response) {
gateway.ServeOption(), gateway.ServeOption(),
corehttp.VersionOption(), corehttp.VersionOption(),
} }
// our global interrupt handler can now try to stop the daemon
close(req.Context().InitDone)
if rootRedirect != nil { if rootRedirect != nil {
opts = append(opts, rootRedirect) opts = append(opts, rootRedirect)
} }
......
...@@ -132,6 +132,14 @@ func main() { ...@@ -132,6 +132,14 @@ func main() {
os.Exit(1) os.Exit(1)
} }
// our global interrupt handler may try to stop the daemon
// before the daemon is ready to be stopped; this dirty
// workaround is for the daemon only; other commands are always
// ready to be stopped
if invoc.cmd != daemonCmd {
close(invoc.req.Context().InitDone)
}
// ok, finally, run the command invocation. // ok, finally, run the command invocation.
output, err := invoc.Run(ctx) output, err := invoc.Run(ctx)
if err != nil { if err != nil {
...@@ -479,6 +487,14 @@ func (i *cmdInvocation) setupInterruptHandler() { ...@@ -479,6 +487,14 @@ func (i *cmdInvocation) setupInterruptHandler() {
for count := 0; ; count++ { for count := 0; ; count++ {
<-sig <-sig
// if we're still initializing, cannot use `ctx.GetNode()`
select {
default: // initialization not done
fmt.Println("Received interrupt signal, shutting down...")
os.Exit(-1)
case <-ctx.InitDone:
}
// TODO cancel the command context instead // TODO cancel the command context instead
n, err := ctx.GetNode() n, err := ctx.GetNode()
......
...@@ -30,6 +30,7 @@ type Context struct { ...@@ -30,6 +30,7 @@ type Context struct {
node *core.IpfsNode node *core.IpfsNode
ConstructNode func() (*core.IpfsNode, error) ConstructNode func() (*core.IpfsNode, error)
InitDone chan bool
} }
// GetConfig returns the config of the current Command exection // GetConfig returns the config of the current Command exection
...@@ -287,7 +288,7 @@ func NewRequest(path []string, opts OptMap, args []string, file files.File, cmd ...@@ -287,7 +288,7 @@ func NewRequest(path []string, opts OptMap, args []string, file files.File, cmd
optDefs = make(map[string]Option) optDefs = make(map[string]Option)
} }
ctx := Context{Context: context.TODO()} ctx := Context{Context: context.TODO(), InitDone: make(chan bool)}
values := make(map[string]interface{}) values := make(map[string]interface{})
req := &request{path, opts, args, file, cmd, ctx, optDefs, values, os.Stdin} req := &request{path, opts, args, file, cmd, ctx, optDefs, values, os.Stdin}
err := req.ConvertOptions() err := req.ConvertOptions()
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论