From 48192ea3d465fbcd3f1190838841021c91b91171 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 2 Nov 2018 08:42:29 +0000 Subject: [PATCH 1/3] Gaialite signal handling is broken, repair it --- client/lcd/root.go | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/client/lcd/root.go b/client/lcd/root.go index 475186ed0..8b2fb4206 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -5,6 +5,8 @@ import ( "net" "net/http" "os" + "os/signal" + "syscall" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" @@ -21,7 +23,6 @@ import ( "github.com/rakyll/statik/fs" "github.com/spf13/cobra" "github.com/spf13/viper" - cmn "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/libs/log" tmserver "github.com/tendermint/tendermint/rpc/lib/server" ) @@ -57,6 +58,25 @@ func ServeCommand(cdc *codec.Codec) *cobra.Command { var listener net.Listener var fingerprint string + + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + closeListener := func() { + err := listener.Close() + logger.Error("error closing listener", "err", err) + } + go func() { + sig := <-sigs + switch sig { + case syscall.SIGTERM: + defer closeListener() + os.Exit(128 + int(syscall.SIGTERM)) + case syscall.SIGINT: + defer closeListener() + os.Exit(128 + int(syscall.SIGINT)) + } + }() + if viper.GetBool(flagInsecure) { listener, err = tmserver.StartHTTPServer( listenAddr, handler, logger, @@ -89,6 +109,7 @@ func ServeCommand(cdc *codec.Codec) *cobra.Command { } defer cleanupFunc() } + listener, err = tmserver.StartHTTPAndTLSServer( listenAddr, handler, certFile, keyFile, @@ -102,13 +123,6 @@ func ServeCommand(cdc *codec.Codec) *cobra.Command { } logger.Info("REST server started") - // wait forever and cleanup - cmn.TrapSignal(func() { - defer cleanupFunc() - err := listener.Close() - logger.Error("error closing listener", "err", err) - }) - return nil }, } From 36bb4409b6c3fc324e91fdd803b76d9ee3b0f382 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 2 Nov 2018 13:44:40 +0000 Subject: [PATCH 2/3] Refactor TrapSignal --- client/lcd/root.go | 24 +++++------------------- server/util.go | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/client/lcd/root.go b/client/lcd/root.go index 8b2fb4206..13b3f7d26 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -2,18 +2,13 @@ package lcd import ( "errors" - "net" - "net/http" - "os" - "os/signal" - "syscall" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/server" auth "github.com/cosmos/cosmos-sdk/x/auth/client/rest" bank "github.com/cosmos/cosmos-sdk/x/bank/client/rest" gov "github.com/cosmos/cosmos-sdk/x/gov/client/rest" @@ -25,6 +20,9 @@ import ( "github.com/spf13/viper" "github.com/tendermint/tendermint/libs/log" tmserver "github.com/tendermint/tendermint/rpc/lib/server" + "net" + "net/http" + "os" ) const ( @@ -59,23 +57,11 @@ func ServeCommand(cdc *codec.Codec) *cobra.Command { var listener net.Listener var fingerprint string - sigs := make(chan os.Signal, 1) - signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) closeListener := func() { err := listener.Close() logger.Error("error closing listener", "err", err) } - go func() { - sig := <-sigs - switch sig { - case syscall.SIGTERM: - defer closeListener() - os.Exit(128 + int(syscall.SIGTERM)) - case syscall.SIGINT: - defer closeListener() - os.Exit(128 + int(syscall.SIGINT)) - } - }() + server.TrapSignal(closeListener) if viper.GetBool(flagInsecure) { listener, err = tmserver.StartHTTPServer( diff --git a/server/util.go b/server/util.go index 5199c1207..51f10c765 100644 --- a/server/util.go +++ b/server/util.go @@ -4,7 +4,9 @@ import ( "encoding/json" "net" "os" + "os/signal" "path/filepath" + "syscall" "github.com/pkg/errors" "github.com/spf13/cobra" @@ -203,6 +205,23 @@ func ExternalIP() (string, error) { return "", errors.New("are you connected to the network?") } +// TrapSignal traps SIGINT and SIGTERM and terminates the server correctly. +func TrapSignal(cleanupFunc func()) { + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + go func() { + sig := <-sigs + switch sig { + case syscall.SIGTERM: + defer cleanupFunc() + os.Exit(128 + int(syscall.SIGTERM)) + case syscall.SIGINT: + defer cleanupFunc() + os.Exit(128 + int(syscall.SIGINT)) + } + }() +} + func skipInterface(iface net.Interface) bool { if iface.Flags&net.FlagUp == 0 { return true // interface down From e598af9eb6489b872486bed6b4324419b7fb0315 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 2 Nov 2018 13:47:14 +0000 Subject: [PATCH 3/3] Fix lint --- client/lcd/root.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/lcd/root.go b/client/lcd/root.go index 13b3f7d26..c6e7917e7 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -52,17 +52,16 @@ func ServeCommand(cdc *codec.Codec) *cobra.Command { sslHosts := viper.GetString(flagSSLHosts) certFile := viper.GetString(flagSSLCertFile) keyFile := viper.GetString(flagSSLKeyFile) - cleanupFunc := func() {} var listener net.Listener var fingerprint string - closeListener := func() { + server.TrapSignal(func() { err := listener.Close() logger.Error("error closing listener", "err", err) - } - server.TrapSignal(closeListener) + }) + var cleanupFunc func() if viper.GetBool(flagInsecure) { listener, err = tmserver.StartHTTPServer( listenAddr, handler, logger,