From 0d6217ca2c610ec1a94aeba96f4dc5a0de581914 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Wed, 28 Sep 2022 14:58:16 +0800 Subject: [PATCH 01/14] add grpc only mode flag --- server/flags/flags.go | 1 + server/start.go | 49 +++++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/server/flags/flags.go b/server/flags/flags.go index aea74bc79b..ecf992da2d 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -20,6 +20,7 @@ const ( // GRPC-related flags. const ( + GRPCOnly = "grpc-only" GRPCEnable = "grpc.enable" GRPCAddress = "grpc.address" GRPCWebEnable = "grpc-web.enable" diff --git a/server/start.go b/server/start.go index 499737dfb2..5bfc10a55f 100644 --- a/server/start.go +++ b/server/start.go @@ -148,6 +148,7 @@ which accepts a path for the resulting pprof file. cmd.Flags().Uint64(server.FlagMinRetainBlocks, 0, "Minimum block height offset during ABCI commit to prune Tendermint blocks") cmd.Flags().String(srvflags.AppDBBackend, "", "The type of database for application and snapshots databases") + cmd.Flags().Bool(srvflags.GRPCOnly, false, "Start the node in gRPC query only mode (no Tendermint process is started)") cmd.Flags().Bool(srvflags.GRPCEnable, true, "Define if the gRPC server should be enabled") cmd.Flags().String(srvflags.GRPCAddress, serverconfig.DefaultGRPCAddress, "the gRPC server address to listen on") cmd.Flags().Bool(srvflags.GRPCWebEnable, true, "Define if the gRPC-Web server should be enabled. (Note: gRPC must also be enabled.)") @@ -310,24 +311,33 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty } genDocProvider := node.DefaultGenesisDocProviderFunc(cfg) - tmNode, err := node.NewNode( - cfg, - pvm.LoadOrGenFilePV(cfg.PrivValidatorKeyFile(), cfg.PrivValidatorStateFile()), - nodeKey, - proxy.NewLocalClientCreator(app), - genDocProvider, - node.DefaultDBProvider, - node.DefaultMetricsProvider(cfg.Instrumentation), - ctx.Logger.With("server", "node"), + var ( + tmNode *node.Node + gRPCOnly = ctx.Viper.GetBool(srvflags.GRPCOnly) ) - if err != nil { - logger.Error("failed init node", "error", err.Error()) - return err - } + if gRPCOnly { + ctx.Logger.Info("starting node in gRPC only mode; Tendermint is disabled") + config.GRPC.Enable = true + } else { + tmNode, err = node.NewNode( + cfg, + pvm.LoadOrGenFilePV(cfg.PrivValidatorKeyFile(), cfg.PrivValidatorStateFile()), + nodeKey, + proxy.NewLocalClientCreator(app), + genDocProvider, + node.DefaultDBProvider, + node.DefaultMetricsProvider(cfg.Instrumentation), + ctx.Logger.With("server", "node"), + ) + if err != nil { + logger.Error("failed init node", "error", err.Error()) + return err + } - if err := tmNode.Start(); err != nil { - logger.Error("failed start tendermint server", "error", err.Error()) - return err + if err := tmNode.Start(); err != nil { + logger.Error("failed start tendermint server", "error", err.Error()) + return err + } } // Add the tx service to the gRPC router. We only need to register this @@ -452,6 +462,13 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty } } + // At this point it is safe to block the process if we're in gRPC only mode as + // we do not need to start Rosetta or handle any Tendermint related processes. + if gRPCOnly { + // wait for signal capture and gracefully return + return server.WaitForQuitSignals() + } + var rosettaSrv crgserver.Server if config.Rosetta.Enable { offlineMode := config.Rosetta.Offline From 2c64ce123d9dddf090c83441ec024c4e3032dd2c Mon Sep 17 00:00:00 2001 From: mmsqe Date: Wed, 28 Sep 2022 15:04:54 +0800 Subject: [PATCH 02/14] add change log --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d67d51f17..274f755d08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (ledger) [#1277](https://github.com/evmos/ethermint/pull/1277) Add Ledger preprocessing transaction hook for EIP-712-signed Cosmos payloads. * (rpc) [#1296](https://github.com/evmos/ethermint/pull/1296) Add RPC Backend unit tests. * (rpc) [#1352](https://github.com/evmos/ethermint/pull/1352) Make the grpc queries run concurrently, don't block the consensus state machine. +* (cli) [#1360](https://github.com/evmos/ethermint/pull/1360) Introduce a new `grpc-only` flag, such that when enabled, will start the node in a query-only mode. Note, gRPC MUST be enabled with this flag. ### Bug Fixes From cc6708df6c4529b617d3ec133a52951a25b592a6 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 09:58:08 +0800 Subject: [PATCH 03/14] add tmNode nil check --- server/start.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/start.go b/server/start.go index 5bfc10a55f..594e7ebd74 100644 --- a/server/start.go +++ b/server/start.go @@ -343,7 +343,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty // Add the tx service to the gRPC router. We only need to register this // service if API or gRPC or JSONRPC is enabled, and avoid doing so in the general // case, because it spawns a new local tendermint RPC client. - if config.API.Enable || config.GRPC.Enable || config.JSONRPC.Enable || config.JSONRPC.EnableIndexer { + if (config.API.Enable || config.GRPC.Enable || config.JSONRPC.Enable || config.JSONRPC.EnableIndexer) && tmNode != nil { clientCtx = clientCtx.WithClient(local.New(tmNode)) app.RegisterTxService(clientCtx) @@ -527,7 +527,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty } defer func() { - if tmNode.IsRunning() { + if tmNode != nil && tmNode.IsRunning() { _ = tmNode.Stop() } From 746d5ef69687911c13dc5fdb44f73b642cb8e9d6 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 09:58:14 +0800 Subject: [PATCH 04/14] only flag to modes --- CHANGELOG.md | 2 +- server/flags/flags.go | 3 +- server/start.go | 67 ++++++++++++++++++++++++------------------- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 274f755d08..56181af6cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,7 +60,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (ledger) [#1277](https://github.com/evmos/ethermint/pull/1277) Add Ledger preprocessing transaction hook for EIP-712-signed Cosmos payloads. * (rpc) [#1296](https://github.com/evmos/ethermint/pull/1296) Add RPC Backend unit tests. * (rpc) [#1352](https://github.com/evmos/ethermint/pull/1352) Make the grpc queries run concurrently, don't block the consensus state machine. -* (cli) [#1360](https://github.com/evmos/ethermint/pull/1360) Introduce a new `grpc-only` flag, such that when enabled, will start the node in a query-only mode. Note, gRPC MUST be enabled with this flag. +* (cli) [#1360](https://github.com/evmos/ethermint/pull/1360) Introduce a new `query-only` flag, such that when enabled (grpc|jsonrpc|grpc,jsonrpc), will start the node in a query-only mode. ### Bug Fixes diff --git a/server/flags/flags.go b/server/flags/flags.go index ecf992da2d..ae11cef885 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -18,9 +18,10 @@ const ( AppDBBackend = "app-db-backend" ) +const QueryOnly = "query-only" + // GRPC-related flags. const ( - GRPCOnly = "grpc-only" GRPCEnable = "grpc.enable" GRPCAddress = "grpc.address" GRPCWebEnable = "grpc-web.enable" diff --git a/server/start.go b/server/start.go index 594e7ebd74..1305531964 100644 --- a/server/start.go +++ b/server/start.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" + "golang.org/x/exp/slices" "github.com/spf13/cobra" @@ -148,7 +149,8 @@ which accepts a path for the resulting pprof file. cmd.Flags().Uint64(server.FlagMinRetainBlocks, 0, "Minimum block height offset during ABCI commit to prune Tendermint blocks") cmd.Flags().String(srvflags.AppDBBackend, "", "The type of database for application and snapshots databases") - cmd.Flags().Bool(srvflags.GRPCOnly, false, "Start the node in gRPC query only mode (no Tendermint process is started)") + cmd.Flags().String(srvflags.QueryOnly, "", "Start the node in query only mode without Tendermint process (grpc|jsonrpc|grpc,jsonrpc)") + cmd.Flags().Bool(srvflags.GRPCEnable, true, "Define if the gRPC server should be enabled") cmd.Flags().String(srvflags.GRPCAddress, serverconfig.DefaultGRPCAddress, "the gRPC server address to listen on") cmd.Flags().Bool(srvflags.GRPCWebEnable, true, "Define if the gRPC-Web server should be enabled. (Note: gRPC must also be enabled.)") @@ -312,12 +314,19 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty genDocProvider := node.DefaultGenesisDocProviderFunc(cfg) var ( - tmNode *node.Node - gRPCOnly = ctx.Viper.GetBool(srvflags.GRPCOnly) + tmNode *node.Node + modes = strings.Split(ctx.Viper.GetString(srvflags.QueryOnly), ",") ) - if gRPCOnly { - ctx.Logger.Info("starting node in gRPC only mode; Tendermint is disabled") - config.GRPC.Enable = true + gRPCQueryMode := slices.Contains(modes, "grpc") + jsonRPCMode := slices.Contains(modes, "jsonrpc") + if gRPCQueryMode || jsonRPCMode { + ctx.Logger.Info(fmt.Sprintf("starting node in %s query only mode; Tendermint is disabled", modes)) + if gRPCQueryMode { + config.GRPC.Enable = true + } + if jsonRPCMode { + config.JSONRPC.Enable = true + } } else { tmNode, err = node.NewNode( cfg, @@ -462,9 +471,30 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty } } - // At this point it is safe to block the process if we're in gRPC only mode as + var ( + httpSrv *http.Server + httpSrvDone chan struct{} + ) + + if config.JSONRPC.Enable { + genDoc, err := genDocProvider() + if err != nil { + return err + } + + clientCtx := clientCtx.WithChainID(genDoc.ChainID) + + tmEndpoint := "/websocket" + tmRPCAddr := cfg.RPC.ListenAddress + httpSrv, httpSrvDone, err = StartJSONRPC(ctx, clientCtx, tmRPCAddr, tmEndpoint, &config, idxer) + if err != nil { + return err + } + } + + // At this point it is safe to block the process if we're in gRPC or JSON-RPC only mode as // we do not need to start Rosetta or handle any Tendermint related processes. - if gRPCOnly { + if gRPCQueryMode || jsonRPCMode { // wait for signal capture and gracefully return return server.WaitForQuitSignals() } @@ -505,27 +535,6 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty } } - var ( - httpSrv *http.Server - httpSrvDone chan struct{} - ) - - if config.JSONRPC.Enable { - genDoc, err := genDocProvider() - if err != nil { - return err - } - - clientCtx := clientCtx.WithChainID(genDoc.ChainID) - - tmEndpoint := "/websocket" - tmRPCAddr := cfg.RPC.ListenAddress - httpSrv, httpSrvDone, err = StartJSONRPC(ctx, clientCtx, tmRPCAddr, tmEndpoint, &config, idxer) - if err != nil { - return err - } - } - defer func() { if tmNode != nil && tmNode.IsRunning() { _ = tmNode.Stop() From fccaca466dcb9015cf88cf27e7a3fcd2a7ee2127 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 09:58:18 +0800 Subject: [PATCH 05/14] fix close for query mode --- server/start.go | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/server/start.go b/server/start.go index 1305531964..ed33221802 100644 --- a/server/start.go +++ b/server/start.go @@ -462,12 +462,18 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty if err != nil { return err } + defer grpcSrv.Stop() if config.GRPCWeb.Enable { grpcWebSrv, err = servergrpc.StartGRPCWeb(grpcSrv, config.Config) if err != nil { ctx.Logger.Error("failed to start grpc-web http server", "error", err) return err } + defer func() { + if err := grpcWebSrv.Close(); err != nil { + logger.Error("failed to close the grpcWebSrc", "error", err.Error()) + } + }() } } @@ -490,6 +496,19 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty if err != nil { return err } + defer func() { + shutdownCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) + defer cancelFn() + if err := httpSrv.Shutdown(shutdownCtx); err != nil { + logger.Error("HTTP server shutdown produced a warning", "error", err.Error()) + } else { + logger.Info("HTTP server shut down, waiting 5 sec") + select { + case <-time.Tick(5 * time.Second): + case <-httpSrvDone: + } + } + }() } // At this point it is safe to block the process if we're in gRPC or JSON-RPC only mode as @@ -547,31 +566,6 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty if apiSrv != nil { _ = apiSrv.Close() } - - if grpcSrv != nil { - grpcSrv.Stop() - if grpcWebSrv != nil { - if err := grpcWebSrv.Close(); err != nil { - logger.Error("failed to close the grpcWebSrc", "error", err.Error()) - } - } - } - - if httpSrv != nil { - shutdownCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) - defer cancelFn() - - if err := httpSrv.Shutdown(shutdownCtx); err != nil { - logger.Error("HTTP server shutdown produced a warning", "error", err.Error()) - } else { - logger.Info("HTTP server shut down, waiting 5 sec") - select { - case <-time.Tick(5 * time.Second): - case <-httpSrvDone: - } - } - } - logger.Info("Bye!") }() From 6a2adde5c8fd3eef9d14e007bf65e35212f534c9 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 10:09:07 +0800 Subject: [PATCH 06/14] fix hint --- server/start.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/start.go b/server/start.go index ed33221802..f07509384d 100644 --- a/server/start.go +++ b/server/start.go @@ -159,7 +159,7 @@ which accepts a path for the resulting pprof file. cmd.Flags().Bool(srvflags.RPCEnable, false, "Defines if Cosmos-sdk REST server should be enabled") cmd.Flags().Bool(srvflags.EnabledUnsafeCors, false, "Defines if CORS should be enabled (unsafe - use it at your own risk)") - cmd.Flags().Bool(srvflags.JSONRPCEnable, true, "Define if the gRPC server should be enabled") + cmd.Flags().Bool(srvflags.JSONRPCEnable, true, "Define if the JSON-RPC server should be enabled") cmd.Flags().StringSlice(srvflags.JSONRPCAPI, config.GetDefaultAPINamespaces(), "Defines a list of JSON-RPC namespaces that should be enabled") cmd.Flags().String(srvflags.JSONRPCAddress, config.DefaultJSONRPCAddress, "the JSON-RPC server address to listen on") cmd.Flags().String(srvflags.JSONWsAddress, config.DefaultJSONRPCWsAddress, "the JSON-RPC WS server address to listen on") From d1bb97e80ec22d2a1f3cac0a7bcf69ba2c28ce26 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 15:49:19 +0800 Subject: [PATCH 07/14] keep grpc-only & json-rpc-only --- CHANGELOG.md | 2 +- server/flags/flags.go | 3 ++- server/start.go | 26 +++++++++++--------------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56181af6cc..88fee8dd5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,7 +60,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (ledger) [#1277](https://github.com/evmos/ethermint/pull/1277) Add Ledger preprocessing transaction hook for EIP-712-signed Cosmos payloads. * (rpc) [#1296](https://github.com/evmos/ethermint/pull/1296) Add RPC Backend unit tests. * (rpc) [#1352](https://github.com/evmos/ethermint/pull/1352) Make the grpc queries run concurrently, don't block the consensus state machine. -* (cli) [#1360](https://github.com/evmos/ethermint/pull/1360) Introduce a new `query-only` flag, such that when enabled (grpc|jsonrpc|grpc,jsonrpc), will start the node in a query-only mode. +* (cli) [#1360](https://github.com/evmos/ethermint/pull/1360) Introduce `json-rpc-only` and `grpc-only` flag, such that when enabled, will start the node in a query-only mode. ### Bug Fixes diff --git a/server/flags/flags.go b/server/flags/flags.go index ae11cef885..1d948770af 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -18,10 +18,11 @@ const ( AppDBBackend = "app-db-backend" ) -const QueryOnly = "query-only" +const JSONRPCOnly = " json-rpc-only" // GRPC-related flags. const ( + GRPCOnly = "grpc-only" GRPCEnable = "grpc.enable" GRPCAddress = "grpc.address" GRPCWebEnable = "grpc-web.enable" diff --git a/server/start.go b/server/start.go index f07509384d..46dc29157a 100644 --- a/server/start.go +++ b/server/start.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "golang.org/x/exp/slices" "github.com/spf13/cobra" @@ -149,8 +148,8 @@ which accepts a path for the resulting pprof file. cmd.Flags().Uint64(server.FlagMinRetainBlocks, 0, "Minimum block height offset during ABCI commit to prune Tendermint blocks") cmd.Flags().String(srvflags.AppDBBackend, "", "The type of database for application and snapshots databases") - cmd.Flags().String(srvflags.QueryOnly, "", "Start the node in query only mode without Tendermint process (grpc|jsonrpc|grpc,jsonrpc)") - + cmd.Flags().Bool(srvflags.JSONRPCOnly, false, "Start the node in query only mode without Tendermint process") + cmd.Flags().Bool(srvflags.GRPCOnly, false, "Start the node in gRPC query only mode without Tendermint process") cmd.Flags().Bool(srvflags.GRPCEnable, true, "Define if the gRPC server should be enabled") cmd.Flags().String(srvflags.GRPCAddress, serverconfig.DefaultGRPCAddress, "the gRPC server address to listen on") cmd.Flags().Bool(srvflags.GRPCWebEnable, true, "Define if the gRPC-Web server should be enabled. (Note: gRPC must also be enabled.)") @@ -314,17 +313,14 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty genDocProvider := node.DefaultGenesisDocProviderFunc(cfg) var ( - tmNode *node.Node - modes = strings.Split(ctx.Viper.GetString(srvflags.QueryOnly), ",") + tmNode *node.Node + jsonRPCOnly = ctx.Viper.GetBool(srvflags.JSONRPCOnly) + gRPCOnly = ctx.Viper.GetBool(srvflags.GRPCOnly) ) - gRPCQueryMode := slices.Contains(modes, "grpc") - jsonRPCMode := slices.Contains(modes, "jsonrpc") - if gRPCQueryMode || jsonRPCMode { - ctx.Logger.Info(fmt.Sprintf("starting node in %s query only mode; Tendermint is disabled", modes)) - if gRPCQueryMode { - config.GRPC.Enable = true - } - if jsonRPCMode { + if jsonRPCOnly || gRPCOnly { + ctx.Logger.Info("starting node in query only mode; Tendermint is disabled") + config.GRPC.Enable = true + if jsonRPCOnly { config.JSONRPC.Enable = true } } else { @@ -511,9 +507,9 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty }() } - // At this point it is safe to block the process if we're in gRPC or JSON-RPC only mode as + // At this point it is safe to block the process if we're in query only mode as // we do not need to start Rosetta or handle any Tendermint related processes. - if gRPCQueryMode || jsonRPCMode { + if jsonRPCOnly || gRPCOnly { // wait for signal capture and gracefully return return server.WaitForQuitSignals() } From f31a32fa78e9e02f218b0485cd161c52f05441b3 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 21:12:23 +0800 Subject: [PATCH 08/14] rm space --- server/flags/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/flags/flags.go b/server/flags/flags.go index 1d948770af..f5998a8d5d 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -18,7 +18,7 @@ const ( AppDBBackend = "app-db-backend" ) -const JSONRPCOnly = " json-rpc-only" +const JSONRPCOnly = "json-rpc-only" // GRPC-related flags. const ( From 1c0b86de0a37f17be00cc762b66d87045565063d Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 21:13:20 +0800 Subject: [PATCH 09/14] mv apiSrv close --- server/start.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/start.go b/server/start.go index 46dc29157a..da6d48f59d 100644 --- a/server/start.go +++ b/server/start.go @@ -435,7 +435,6 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty apiSrv = api.New(clientCtx, ctx.Logger.With("server", "api")) app.RegisterAPIRoutes(apiSrv, config.API) errCh := make(chan error) - go func() { if err := apiSrv.Start(config.Config); err != nil { errCh <- err @@ -447,6 +446,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty return err case <-time.After(types.ServerStartTime): // assume server started successfully } + defer apiSrv.Close() } var ( @@ -558,10 +558,6 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty if cpuProfileCleanup != nil { _ = cpuProfileCleanup() } - - if apiSrv != nil { - _ = apiSrv.Close() - } logger.Info("Bye!") }() From 5a73c526e961ce553de3519b1dd336ec91ac9af2 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 21:13:57 +0800 Subject: [PATCH 10/14] mv cpuProfileCleanup --- server/start.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/server/start.go b/server/start.go index da6d48f59d..37fda13238 100644 --- a/server/start.go +++ b/server/start.go @@ -238,8 +238,6 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty cfg := ctx.Config home := cfg.RootDir logger := ctx.Logger - var cpuProfileCleanup func() error - if cpuProfile := ctx.Viper.GetString(srvflags.CPUProfile); cpuProfile != "" { fp, err := ethdebug.ExpandHome(cpuProfile) if err != nil { @@ -256,15 +254,13 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty return err } - cpuProfileCleanup = func() error { + defer func() { ctx.Logger.Info("stopping CPU profiler", "profile", cpuProfile) pprof.StopCPUProfile() if err := f.Close(); err != nil { logger.Error("failed to close CPU profiler file", "error", err.Error()) - return err } - return nil - } + }() } traceWriterFile := ctx.Viper.GetString(srvflags.TraceStore) @@ -554,10 +550,6 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty if tmNode != nil && tmNode.IsRunning() { _ = tmNode.Stop() } - - if cpuProfileCleanup != nil { - _ = cpuProfileCleanup() - } logger.Info("Bye!") }() From b289b443ccd75035fe5e32674657ca1471536404 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 29 Sep 2022 21:14:13 +0800 Subject: [PATCH 11/14] mv tmNode stop --- server/start.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/server/start.go b/server/start.go index 37fda13238..c4ba5412f2 100644 --- a/server/start.go +++ b/server/start.go @@ -339,6 +339,13 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty logger.Error("failed start tendermint server", "error", err.Error()) return err } + + defer func() { + if tmNode.IsRunning() { + _ = tmNode.Stop() + } + logger.Info("Bye!") + }() } // Add the tx service to the gRPC router. We only need to register this @@ -545,14 +552,6 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty case <-time.After(types.ServerStartTime): // assume server started successfully } } - - defer func() { - if tmNode != nil && tmNode.IsRunning() { - _ = tmNode.Stop() - } - logger.Info("Bye!") - }() - // Wait for SIGINT or SIGTERM signal return server.WaitForQuitSignals() } From 922c33ca245fa79b65060fb2a8778da34f688bd3 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Fri, 30 Sep 2022 10:36:00 +0800 Subject: [PATCH 12/14] disable indexer on query only which need tm client on start --- server/start.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server/start.go b/server/start.go index c4ba5412f2..507243bdb2 100644 --- a/server/start.go +++ b/server/start.go @@ -319,6 +319,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty if jsonRPCOnly { config.JSONRPC.Enable = true } + config.JSONRPC.EnableIndexer = false } else { tmNode, err = node.NewNode( cfg, From b9cdee624bd2c8dc0d0c4e5f7a6ecd6e76169e38 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Fri, 30 Sep 2022 10:42:41 +0800 Subject: [PATCH 13/14] update nix --- gomod2nix.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gomod2nix.toml b/gomod2nix.toml index bc4dba2b90..624dd8be47 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -105,8 +105,8 @@ schema = 3 version = "v0.19.2-0.20220916140702-9b6be3095313" hash = "sha256-49xr/7/4L1wZ45eW5lE7C4SlcbGf4gBY+662SfJiWPQ=" [mod."github.com/cosmos/ibc-go/v5"] - version = "v5.0.0-rc2" - hash = "sha256-p4tpb6I6bdXix1sTYivJEygUtM4q+nTIKdSlf6c/LCw=" + version = "v5.0.0" + hash = "sha256-sDZdmuGohaaBF7bxrjo9PWJnmoF+VOkjySYhsFixPz4=" [mod."github.com/cosmos/ledger-cosmos-go"] version = "v0.11.1" hash = "sha256-yli+VvVtZmHo2LPvCY6lYVUfcCDn3sBLDL+a8KIlqDA=" From 9cff263a8e9129df70f5e295c93220958625a1ff Mon Sep 17 00:00:00 2001 From: mmsqe Date: Wed, 19 Oct 2022 15:47:52 +0800 Subject: [PATCH 14/14] revert json-rpc-only change --- CHANGELOG.md | 2 +- server/flags/flags.go | 2 -- server/start.go | 13 ++++--------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d20f9b733..36d62fb1c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,7 +60,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (ledger) [#1277](https://github.com/evmos/ethermint/pull/1277) Add Ledger preprocessing transaction hook for EIP-712-signed Cosmos payloads. * (rpc) [#1296](https://github.com/evmos/ethermint/pull/1296) Add RPC Backend unit tests. * (rpc) [#1352](https://github.com/evmos/ethermint/pull/1352) Make the grpc queries run concurrently, don't block the consensus state machine. -* (cli) [#1360](https://github.com/evmos/ethermint/pull/1360) Introduce `json-rpc-only` and `grpc-only` flag, such that when enabled, will start the node in a query-only mode. +* (cli) [#1360](https://github.com/evmos/ethermint/pull/1360) Introduce a new `grpc-only` flag, such that when enabled, will start the node in a query-only mode. Note, gRPC MUST be enabled with this flag. ### Bug Fixes diff --git a/server/flags/flags.go b/server/flags/flags.go index f5998a8d5d..ecf992da2d 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -18,8 +18,6 @@ const ( AppDBBackend = "app-db-backend" ) -const JSONRPCOnly = "json-rpc-only" - // GRPC-related flags. const ( GRPCOnly = "grpc-only" diff --git a/server/start.go b/server/start.go index 507243bdb2..59317091b1 100644 --- a/server/start.go +++ b/server/start.go @@ -148,7 +148,6 @@ which accepts a path for the resulting pprof file. cmd.Flags().Uint64(server.FlagMinRetainBlocks, 0, "Minimum block height offset during ABCI commit to prune Tendermint blocks") cmd.Flags().String(srvflags.AppDBBackend, "", "The type of database for application and snapshots databases") - cmd.Flags().Bool(srvflags.JSONRPCOnly, false, "Start the node in query only mode without Tendermint process") cmd.Flags().Bool(srvflags.GRPCOnly, false, "Start the node in gRPC query only mode without Tendermint process") cmd.Flags().Bool(srvflags.GRPCEnable, true, "Define if the gRPC server should be enabled") cmd.Flags().String(srvflags.GRPCAddress, serverconfig.DefaultGRPCAddress, "the gRPC server address to listen on") @@ -309,16 +308,12 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty genDocProvider := node.DefaultGenesisDocProviderFunc(cfg) var ( - tmNode *node.Node - jsonRPCOnly = ctx.Viper.GetBool(srvflags.JSONRPCOnly) - gRPCOnly = ctx.Viper.GetBool(srvflags.GRPCOnly) + tmNode *node.Node + gRPCOnly = ctx.Viper.GetBool(srvflags.GRPCOnly) ) - if jsonRPCOnly || gRPCOnly { + if gRPCOnly { ctx.Logger.Info("starting node in query only mode; Tendermint is disabled") config.GRPC.Enable = true - if jsonRPCOnly { - config.JSONRPC.Enable = true - } config.JSONRPC.EnableIndexer = false } else { tmNode, err = node.NewNode( @@ -513,7 +508,7 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty // At this point it is safe to block the process if we're in query only mode as // we do not need to start Rosetta or handle any Tendermint related processes. - if jsonRPCOnly || gRPCOnly { + if gRPCOnly { // wait for signal capture and gracefully return return server.WaitForQuitSignals() }