rpc: add configurable timeouts to http server (#979)
* Add configurable timeouts to http server Closes: #963 * add flags * changelog * fix toml
This commit is contained in:
		
							parent
							
								
									67fba0a813
								
							
						
					
					
						commit
						dbe9f705cd
					
				| @ -46,6 +46,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ | ||||
| 
 | ||||
| * (rpc) [tharsis#975](https://github.com/tharsis/ethermint/pull/975) Fix unexpected `nil` values for `reward`, returned by `EffectiveGasTipValue(blockBaseFee)` in the `eth_feeHistory` RPC method. | ||||
| 
 | ||||
| ### Improvements | ||||
| 
 | ||||
| - (rpc) [tharsis#979](https://github.com/tharsis/ethermint/pull/979) Add configurable timeouts to http server | ||||
| 
 | ||||
| ## [v0.10.1] - 2022-03-04 | ||||
| 
 | ||||
| ### Bug Fixes | ||||
|  | ||||
| @ -41,6 +41,10 @@ const ( | ||||
| 	DefaultEVMTimeout = 5 * time.Second | ||||
| 	// default 1.0 eth
 | ||||
| 	DefaultTxFeeCap float64 = 1.0 | ||||
| 
 | ||||
| 	DefaultHTTPTimeout = 30 * time.Second | ||||
| 
 | ||||
| 	DefaultHTTPIdleTimeout = 120 * time.Second | ||||
| ) | ||||
| 
 | ||||
| var evmTracers = []string{"json", "markdown", "struct", "access_list"} | ||||
| @ -86,6 +90,10 @@ type JSONRPCConfig struct { | ||||
| 	LogsCap int32 `mapstructure:"logs-cap"` | ||||
| 	// BlockRangeCap defines the max block range allowed for `eth_getLogs` query.
 | ||||
| 	BlockRangeCap int32 `mapstructure:"block-range-cap"` | ||||
| 	// HTTPTimeout is the read/write timeout of http json-rpc server.
 | ||||
| 	HTTPTimeout time.Duration `mapstructure:"http-timeout"` | ||||
| 	// HTTPIdleTimeout is the idle timeout of http json-rpc server.
 | ||||
| 	HTTPIdleTimeout time.Duration `mapstructure:"http-idle-timeout"` | ||||
| } | ||||
| 
 | ||||
| // TLSConfig defines the certificate and matching private key for the server.
 | ||||
| @ -170,17 +178,19 @@ func GetAPINamespaces() []string { | ||||
| // DefaultJSONRPCConfig returns an EVM config with the JSON-RPC API enabled by default
 | ||||
| func DefaultJSONRPCConfig() *JSONRPCConfig { | ||||
| 	return &JSONRPCConfig{ | ||||
| 		Enable:        true, | ||||
| 		API:           GetDefaultAPINamespaces(), | ||||
| 		Address:       DefaultJSONRPCAddress, | ||||
| 		WsAddress:     DefaultJSONRPCWsAddress, | ||||
| 		GasCap:        DefaultGasCap, | ||||
| 		EVMTimeout:    DefaultEVMTimeout, | ||||
| 		TxFeeCap:      DefaultTxFeeCap, | ||||
| 		FilterCap:     DefaultFilterCap, | ||||
| 		FeeHistoryCap: DefaultFeeHistoryCap, | ||||
| 		BlockRangeCap: DefaultBlockRangeCap, | ||||
| 		LogsCap:       DefaultLogsCap, | ||||
| 		Enable:          true, | ||||
| 		API:             GetDefaultAPINamespaces(), | ||||
| 		Address:         DefaultJSONRPCAddress, | ||||
| 		WsAddress:       DefaultJSONRPCWsAddress, | ||||
| 		GasCap:          DefaultGasCap, | ||||
| 		EVMTimeout:      DefaultEVMTimeout, | ||||
| 		TxFeeCap:        DefaultTxFeeCap, | ||||
| 		FilterCap:       DefaultFilterCap, | ||||
| 		FeeHistoryCap:   DefaultFeeHistoryCap, | ||||
| 		BlockRangeCap:   DefaultBlockRangeCap, | ||||
| 		LogsCap:         DefaultLogsCap, | ||||
| 		HTTPTimeout:     DefaultHTTPTimeout, | ||||
| 		HTTPIdleTimeout: DefaultHTTPIdleTimeout, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -214,6 +224,14 @@ func (c JSONRPCConfig) Validate() error { | ||||
| 		return errors.New("JSON-RPC block range cap cannot be negative") | ||||
| 	} | ||||
| 
 | ||||
| 	if c.HTTPTimeout < 0 { | ||||
| 		return errors.New("JSON-RPC HTTP timeout duration cannot be negative") | ||||
| 	} | ||||
| 
 | ||||
| 	if c.HTTPIdleTimeout < 0 { | ||||
| 		return errors.New("JSON-RPC HTTP idle timeout duration cannot be negative") | ||||
| 	} | ||||
| 
 | ||||
| 	// TODO: validate APIs
 | ||||
| 	seenAPIs := make(map[string]bool) | ||||
| 	for _, api := range c.API { | ||||
| @ -262,17 +280,19 @@ func GetConfig(v *viper.Viper) Config { | ||||
| 			Tracer: v.GetString("evm.tracer"), | ||||
| 		}, | ||||
| 		JSONRPC: JSONRPCConfig{ | ||||
| 			Enable:        v.GetBool("json-rpc.enable"), | ||||
| 			API:           v.GetStringSlice("json-rpc.api"), | ||||
| 			Address:       v.GetString("json-rpc.address"), | ||||
| 			WsAddress:     v.GetString("json-rpc.ws-address"), | ||||
| 			GasCap:        v.GetUint64("json-rpc.gas-cap"), | ||||
| 			FilterCap:     v.GetInt32("json-rpc.filter-cap"), | ||||
| 			FeeHistoryCap: v.GetInt32("json-rpc.feehistory-cap"), | ||||
| 			TxFeeCap:      v.GetFloat64("json-rpc.txfee-cap"), | ||||
| 			EVMTimeout:    v.GetDuration("json-rpc.evm-timeout"), | ||||
| 			LogsCap:       v.GetInt32("json-rpc.logs-cap"), | ||||
| 			BlockRangeCap: v.GetInt32("json-rpc.block-range-cap"), | ||||
| 			Enable:          v.GetBool("json-rpc.enable"), | ||||
| 			API:             v.GetStringSlice("json-rpc.api"), | ||||
| 			Address:         v.GetString("json-rpc.address"), | ||||
| 			WsAddress:       v.GetString("json-rpc.ws-address"), | ||||
| 			GasCap:          v.GetUint64("json-rpc.gas-cap"), | ||||
| 			FilterCap:       v.GetInt32("json-rpc.filter-cap"), | ||||
| 			FeeHistoryCap:   v.GetInt32("json-rpc.feehistory-cap"), | ||||
| 			TxFeeCap:        v.GetFloat64("json-rpc.txfee-cap"), | ||||
| 			EVMTimeout:      v.GetDuration("json-rpc.evm-timeout"), | ||||
| 			LogsCap:         v.GetInt32("json-rpc.logs-cap"), | ||||
| 			BlockRangeCap:   v.GetInt32("json-rpc.block-range-cap"), | ||||
| 			HTTPTimeout:     v.GetDuration("json-rpc.http-timeout"), | ||||
| 			HTTPIdleTimeout: v.GetDuration("json-rpc.http-idle-timeout"), | ||||
| 		}, | ||||
| 		TLS: TLSConfig{ | ||||
| 			CertificatePath: v.GetString("tls.certificate-path"), | ||||
|  | ||||
| @ -53,6 +53,12 @@ logs-cap = {{ .JSONRPC.LogsCap }} | ||||
| # BlockRangeCap defines the max block range allowed for 'eth_getLogs' query. | ||||
| block-range-cap = {{ .JSONRPC.BlockRangeCap }} | ||||
| 
 | ||||
| # HTTPTimeout is the read/write timeout of http json-rpc server. | ||||
| http-timeout = "{{ .JSONRPC.HTTPTimeout }}" | ||||
| 
 | ||||
| # HTTPIdleTimeout is the idle timeout of http json-rpc server. | ||||
| http-idle-timeout = "{{ .JSONRPC.HTTPIdleTimeout }}" | ||||
| 
 | ||||
| ############################################################################### | ||||
| ###                             TLS Configuration                           ### | ||||
| ############################################################################### | ||||
|  | ||||
| @ -31,16 +31,18 @@ const ( | ||||
| 
 | ||||
| // JSON-RPC flags
 | ||||
| const ( | ||||
| 	JSONRPCEnable        = "json-rpc.enable" | ||||
| 	JSONRPCAPI           = "json-rpc.api" | ||||
| 	JSONRPCAddress       = "json-rpc.address" | ||||
| 	JSONWsAddress        = "json-rpc.ws-address" | ||||
| 	JSONRPCGasCap        = "json-rpc.gas-cap" | ||||
| 	JSONRPCEVMTimeout    = "json-rpc.evm-timeout" | ||||
| 	JSONRPCTxFeeCap      = "json-rpc.txfee-cap" | ||||
| 	JSONRPCFilterCap     = "json-rpc.filter-cap" | ||||
| 	JSONRPCLogsCap       = "json-rpc.logs-cap" | ||||
| 	JSONRPCBlockRangeCap = "json-rpc.block-range-cap" | ||||
| 	JSONRPCEnable          = "json-rpc.enable" | ||||
| 	JSONRPCAPI             = "json-rpc.api" | ||||
| 	JSONRPCAddress         = "json-rpc.address" | ||||
| 	JSONWsAddress          = "json-rpc.ws-address" | ||||
| 	JSONRPCGasCap          = "json-rpc.gas-cap" | ||||
| 	JSONRPCEVMTimeout      = "json-rpc.evm-timeout" | ||||
| 	JSONRPCTxFeeCap        = "json-rpc.txfee-cap" | ||||
| 	JSONRPCFilterCap       = "json-rpc.filter-cap" | ||||
| 	JSONRPCLogsCap         = "json-rpc.logs-cap" | ||||
| 	JSONRPCBlockRangeCap   = "json-rpc.block-range-cap" | ||||
| 	JSONRPCHTTPTimeout     = "json-rpc.http-timeout" | ||||
| 	JSONRPCHTTPIdleTimeout = "json-rpc.http-idle-timeout" | ||||
| ) | ||||
| 
 | ||||
| // EVM flags
 | ||||
|  | ||||
| @ -59,8 +59,11 @@ func StartJSONRPC(ctx *server.Context, clientCtx client.Context, tmRPCAddr, tmEn | ||||
| 	} | ||||
| 
 | ||||
| 	httpSrv := &http.Server{ | ||||
| 		Addr:    config.JSONRPC.Address, | ||||
| 		Handler: handlerWithCors.Handler(r), | ||||
| 		Addr:         config.JSONRPC.Address, | ||||
| 		Handler:      handlerWithCors.Handler(r), | ||||
| 		ReadTimeout:  config.JSONRPC.HTTPTimeout, | ||||
| 		WriteTimeout: config.JSONRPC.HTTPTimeout, | ||||
| 		IdleTimeout:  config.JSONRPC.HTTPIdleTimeout, | ||||
| 	} | ||||
| 	httpSrvDone := make(chan struct{}, 1) | ||||
| 
 | ||||
|  | ||||
| @ -159,6 +159,8 @@ which accepts a path for the resulting pprof file. | ||||
| 	cmd.Flags().Float64(srvflags.JSONRPCTxFeeCap, config.DefaultTxFeeCap, "Sets a cap on transaction fee that can be sent via the RPC APIs (1 = default 1 photon)") | ||||
| 	cmd.Flags().Int32(srvflags.JSONRPCFilterCap, config.DefaultFilterCap, "Sets the global cap for total number of filters that can be created") | ||||
| 	cmd.Flags().Duration(srvflags.JSONRPCEVMTimeout, config.DefaultEVMTimeout, "Sets a timeout used for eth_call (0=infinite)") | ||||
| 	cmd.Flags().Duration(srvflags.JSONRPCHTTPTimeout, config.DefaultHTTPTimeout, "Sets a read/write timeout for json-rpc http server (0=infinite)") | ||||
| 	cmd.Flags().Duration(srvflags.JSONRPCHTTPIdleTimeout, config.DefaultHTTPIdleTimeout, "Sets a idle timeout for json-rpc http server (0=infinite)") | ||||
| 	cmd.Flags().Int32(srvflags.JSONRPCLogsCap, config.DefaultLogsCap, "Sets the max number of results can be returned from single `eth_getLogs` query") | ||||
| 	cmd.Flags().Int32(srvflags.JSONRPCBlockRangeCap, config.DefaultBlockRangeCap, "Sets the max block range allowed for `eth_getLogs` query") | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user