better daemon + main exit semantics
Juan Batiz-Benet committed
Jan 2, 2015 at 07:58 UTC
cf62f63b58576e32aef5ea6c358123c72dc751dd
2 files changed
+36
-29
cmd/ipfs/daemon.go
+17
-17
@@ -158,27 +158,27 @@ func listenAndServeAPI(node *core.IpfsNode, req cmds.Request, addr ma.Multiaddr)
158
ifpsHandler := &ipfsHandler{node}
159
mux.Handle("/ipfs/", ifpsHandler)
160
161
- done := make(chan struct{}, 1)
162
- defer func() {
163
- done <- struct{}{}
164
- }()
161
+ // if the server exits beforehand
162
+ var serverError error
163
+ serverExited := make(chan struct{})
164
166
- // go wait until the node dies
165
go func() {
168
- select {
169
- case <-node.Closed():
170
- case <-done:
171
- return
172
- }
173
-
174
- log.Infof("terminating daemon at %s...", addr)
175
- server.Shutdown <- true
166
+ fmt.Printf("daemon listening on %s\n", addr)
167
+ serverError = server.ListenAndServe(host, mux)
168
+ close(serverExited)
169
}()
170
178
- fmt.Printf("daemon listening on %s\n", addr)
179
- if err := server.ListenAndServe(host, mux); err != nil {
180
- return err
171
+ // wait for server to exit.
172
+ select {
173
+ case <-serverExited:
174
+
175
+ // if node being closed before server exits, close server
176
+ case <-node.Closing():
177
+ log.Infof("daemon at %s terminating...", addr)
178
+ server.Shutdown <- true
179
+ <-serverExited // now, DO wait until server exits
180
}
181
183
- return nil
182
+ log.Infof("daemon at %s terminated", addr)
183
+ return serverError
184
}
cmd/ipfs/main.go
+19
-12
@@ -490,25 +490,32 @@ func (i *cmdInvocation) setupInterruptHandler() {
490
sig := allInterruptSignals()
491
492
go func() {
493
+ // first time, try to shut down.
494
494
- for {
495
- // first time, try to shut down.
495
+ // loop because we may be
496
+ for count := 0; ; count++ {
497
<-sig
497
- log.Critical("Received interrupt signal, shutting down...")
498
499
n, err := ctx.GetNode()
500
- if err == nil {
501
- go n.Close()
502
- select {
503
- case <-n.Closed():
504
- case <-sig:
505
- log.Critical("Received another interrupt signal, terminating...")
506
- }
500
+ if err != nil {
501
+ log.Error(err)
502
+ log.Critical("Received interrupt signal, terminating...")
503
+ os.Exit(-1)
504
}
505
509
- os.Exit(0)
506
+ switch count {
507
+ case 0:
508
+ log.Critical("Received interrupt signal, shutting down...")
509
+ go func() {
510
+ n.Close()
511
+ log.Info("Gracefully shut down.")
512
+ }()
513
+
514
+ default:
515
+ log.Critical("Received another interrupt before graceful shutdown, terminating...")
516
+ os.Exit(-1)
517
+ }
518
}
511
-
519
}()
520
}
521