@cryptotaxi247 / kubo / commits / cf62f63b5

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