node: Basic graceful shutdown

This commit is contained in:
Łukasz Magiera
2019-09-17 16:23:08 +02:00
parent 215f95aa5b
commit 83f1a336a6
10 changed files with 102 additions and 19 deletions
+1 -1
View File
@@ -67,7 +67,7 @@ func main() {
}
if err := app.Run(os.Args); err != nil {
log.Error(err)
log.Warn(err)
return
}
}
+24 -3
View File
@@ -1,8 +1,12 @@
package main
import (
"context"
"github.com/filecoin-project/go-lotus/lib/valctx"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/multiformats/go-multiaddr"
"golang.org/x/xerrors"
@@ -32,7 +36,7 @@ var runCmd = &cli.Command{
if err != nil {
return err
}
ctx := lcli.ReqContext(cctx)
ctx := &valctx.Context{Parent: lcli.ReqContext(cctx)}
go func() {
// a hack for now to handle sigint
@@ -61,7 +65,7 @@ var runCmd = &cli.Command{
}
var minerapi api.StorageMiner
err = node.New(ctx,
stop, err := node.New(ctx,
node.StorageMiner(&minerapi),
node.Online(),
node.Repo(r),
@@ -101,6 +105,23 @@ var runCmd = &cli.Command{
}
http.Handle("/rpc/v0", ah)
return http.ListenAndServe("127.0.0.1:"+cctx.String("api"), http.DefaultServeMux)
srv := &http.Server{Addr: "127.0.0.1:" + cctx.String("api"), Handler: http.DefaultServeMux}
sigChan := make(chan os.Signal, 2)
go func() {
<-sigChan
log.Warn("Shutting down..")
if err := stop(context.TODO()); err != nil {
log.Errorf("graceful shutting down failed: %s", err)
}
if err := srv.Shutdown(context.TODO()); err != nil {
log.Errorf("shutting down RPC server failed: %s", err)
}
log.Warn("Graceful shutdown successful")
}()
signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)
return srv.ListenAndServe()
},
}
+2 -2
View File
@@ -65,7 +65,7 @@ var DaemonCmd = &cli.Command{
}
var api api.FullNode
err = node.New(ctx,
stop, err := node.New(ctx,
node.FullAPI(&api),
node.Online(),
@@ -86,6 +86,6 @@ var DaemonCmd = &cli.Command{
}
// TODO: properly parse api endpoint (or make it a URL)
return serveRPC(api, "127.0.0.1:"+cctx.String("api"))
return serveRPC(api, stop, "127.0.0.1:"+cctx.String("api"))
},
}
+1 -2
View File
@@ -2,7 +2,6 @@ package main
import (
"context"
"log"
"os"
logging "github.com/ipfs/go-log"
@@ -65,7 +64,7 @@ func main() {
Code: trace.StatusCodeFailedPrecondition,
Message: err.Error(),
})
log.Printf("%+v\n", err)
log.Warn(err)
}
return
}
+25 -2
View File
@@ -1,14 +1,22 @@
package main
import (
"context"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/filecoin-project/go-lotus/api"
"github.com/filecoin-project/go-lotus/lib/auth"
"github.com/filecoin-project/go-lotus/lib/jsonrpc"
"github.com/filecoin-project/go-lotus/node"
logging "github.com/ipfs/go-log"
)
func serveRPC(a api.FullNode, addr string) error {
var log = logging.Logger("main")
func serveRPC(a api.FullNode, stop node.StopFunc, addr string) error {
rpcServer := jsonrpc.NewServer()
rpcServer.Register("Filecoin", api.PermissionedFullAPI(a))
@@ -18,5 +26,20 @@ func serveRPC(a api.FullNode, addr string) error {
}
http.Handle("/rpc/v0", ah)
return http.ListenAndServe(addr, http.DefaultServeMux)
srv := &http.Server{Addr: addr, Handler: http.DefaultServeMux}
sigChan := make(chan os.Signal, 2)
go func() {
<-sigChan
if err := stop(context.TODO()); err != nil {
log.Errorf("graceful shutting down failed: %s", err)
}
if err := srv.Shutdown(context.TODO()); err != nil {
log.Errorf("shutting down RPC server failed: %s", err)
}
}()
signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)
return srv.ListenAndServe()
}