mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-26 23:53:19 +08:00
Dirty hack to fix race conditions in the daemon
This commit is contained in:
@ -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().ContextIsReadyToBeClosed)
|
||||||
|
|
||||||
if rootRedirect != nil {
|
if rootRedirect != nil {
|
||||||
opts = append(opts, rootRedirect)
|
opts = append(opts, rootRedirect)
|
||||||
}
|
}
|
||||||
|
@ -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().ContextIsReadyToBeClosed)
|
||||||
|
}
|
||||||
|
|
||||||
// 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 {
|
||||||
@ -473,6 +481,9 @@ func (i *cmdInvocation) setupInterruptHandler() {
|
|||||||
sig := allInterruptSignals()
|
sig := allInterruptSignals()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
// wait till the context is ready to be closed
|
||||||
|
<-ctx.ContextIsReadyToBeClosed
|
||||||
|
|
||||||
// first time, try to shut down.
|
// first time, try to shut down.
|
||||||
|
|
||||||
// loop because we may be
|
// loop because we may be
|
||||||
|
@ -28,8 +28,9 @@ type Context struct {
|
|||||||
config *config.Config
|
config *config.Config
|
||||||
LoadConfig func(path string) (*config.Config, error)
|
LoadConfig func(path string) (*config.Config, error)
|
||||||
|
|
||||||
node *core.IpfsNode
|
node *core.IpfsNode
|
||||||
ConstructNode func() (*core.IpfsNode, error)
|
ConstructNode func() (*core.IpfsNode, error)
|
||||||
|
ContextIsReadyToBeClosed 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
|
|||||||
optDefs = make(map[string]Option)
|
optDefs = make(map[string]Option)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := Context{Context: context.TODO()}
|
ctx := Context{Context: context.TODO(), ContextIsReadyToBeClosed: 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()
|
||||||
|
Reference in New Issue
Block a user