node: Basic graceful shutdown
This commit is contained in:
@@ -67,7 +67,7 @@ func main() {
|
||||
}
|
||||
|
||||
if err := app.Run(os.Args); err != nil {
|
||||
log.Error(err)
|
||||
log.Warn(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user