From 97d6d03ca9a2d021c0b8e02f3c0023b85164e4f5 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 27 Aug 2021 21:05:41 -0400 Subject: [PATCH 1/5] cmd/geth, cmd/utils/flags, eth/ethconfig: add http rpc timeout option (#23416) --- cmd/geth/config_test.go | 16 ++++++ cmd/geth/main.go | 1 + cmd/geth/testdata/config.toml | 95 +++++++++++++++++++++++++++++++++++ cmd/geth/usage.go | 1 + cmd/utils/flags.go | 19 +++++++ eth/api_backend.go | 5 ++ eth/ethconfig/config.go | 12 +++-- eth/ethconfig/gen_config.go | 6 +++ internal/ethapi/api.go | 8 ++- internal/ethapi/backend.go | 3 ++ les/api_backend.go | 5 ++ 11 files changed, 165 insertions(+), 6 deletions(-) create mode 100644 cmd/geth/config_test.go create mode 100644 cmd/geth/testdata/config.toml diff --git a/cmd/geth/config_test.go b/cmd/geth/config_test.go new file mode 100644 index 0000000000000..90ebcf91f4c14 --- /dev/null +++ b/cmd/geth/config_test.go @@ -0,0 +1,16 @@ +package main + +import ( + "testing" +) + +func TestTomlHTTPRpcTimeout(t *testing.T) { + var cfg gethConfig + err := loadConfig("testdata/config.toml", &cfg) + if err != nil { + t.Fatal(err) + } + if cfg.Eth.HTTPRpcTimeout.Seconds() != 20 { + t.Errorf("HTTPRpcTimeout should be 20 seconds") + } +} diff --git a/cmd/geth/main.go b/cmd/geth/main.go index cfc1a62b6d765..14736fc051040 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -154,6 +154,7 @@ var ( rpcFlags = []cli.Flag{ utils.HTTPEnabledFlag, + utils.HTTPRpcTimeoutFlag, utils.HTTPListenAddrFlag, utils.HTTPPortFlag, utils.HTTPCORSDomainFlag, diff --git a/cmd/geth/testdata/config.toml b/cmd/geth/testdata/config.toml new file mode 100644 index 0000000000000..bc6c929fc0da1 --- /dev/null +++ b/cmd/geth/testdata/config.toml @@ -0,0 +1,95 @@ +[Eth] +NetworkId = 1 +SyncMode = "snap" +EthDiscoveryURLs = ["enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net"] +SnapDiscoveryURLs = ["enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net"] +NoPruning = false +NoPrefetch = false +TxLookupLimit = 2350000 +LightPeers = 100 +UltraLightFraction = 75 +DatabaseCache = 512 +DatabaseFreezer = "" +TrieCleanCache = 154 +TrieCleanCacheJournal = "triecache" +TrieCleanCacheRejournal = 3600000000000 +TrieDirtyCache = 256 +TrieTimeout = 3600000000000 +SnapshotCache = 102 +Preimages = false +EnablePreimageRecording = false +RPCGasCap = 50000000 +RPCTxFeeCap = 1e+00 +HTTPRpcTimeout = 20000000000 + +[Eth.Miner] +GasFloor = 8000000 +GasCeil = 8000000 +GasPrice = 1000000000 +Recommit = 3000000000 +Noverify = false + +[Eth.Ethash] +CacheDir = "ethash" +CachesInMem = 2 +CachesOnDisk = 3 +CachesLockMmap = false +DatasetDir = "/home/mr/.ethash" +DatasetsInMem = 1 +DatasetsOnDisk = 2 +DatasetsLockMmap = false +PowMode = 0 +NotifyFull = false + +[Eth.TxPool] +Locals = [] +NoLocals = false +Journal = "transactions.rlp" +Rejournal = 3600000000000 +PriceLimit = 1 +PriceBump = 10 +AccountSlots = 16 +GlobalSlots = 5120 +AccountQueue = 64 +GlobalQueue = 1024 +Lifetime = 10800000000000 + +[Eth.GPO] +Blocks = 20 +Percentile = 60 +MaxPrice = 500000000000 +IgnorePrice = 2 + +[Node] +DataDir = ".dev" +IPCPath = "geth.ipc" +HTTPHost = "" +HTTPPort = 8545 +HTTPVirtualHosts = ["localhost"] +HTTPModules = ["net", "web3", "eth"] +WSHost = "" +WSPort = 8546 +WSModules = ["net", "web3", "eth"] +GraphQLVirtualHosts = ["localhost"] + +[Node.P2P] +MaxPeers = 50 +NoDiscovery = false +StaticNodes = [] +TrustedNodes = [] +ListenAddr = ":30303" +EnableMsgEvents = false + +[Node.HTTPTimeouts] +ReadTimeout = 30000000000 +WriteTimeout = 30000000000 +IdleTimeout = 120000000000 + +[Metrics] +HTTP = "127.0.0.1" +Port = 6060 +InfluxDBEndpoint = "http://localhost:8086" +InfluxDBDatabase = "geth" +InfluxDBUsername = "test" +InfluxDBPassword = "test" +InfluxDBTags = "host=localhost" diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index f39e4f402fcaf..0bbda1302a294 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -134,6 +134,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.IPCDisabledFlag, utils.IPCPathFlag, utils.HTTPEnabledFlag, + utils.HTTPRpcTimeoutFlag, utils.HTTPListenAddrFlag, utils.HTTPPortFlag, utils.HTTPApiFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 2953a00329dc1..f3beb062d9d59 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -775,6 +775,12 @@ var ( Name: "catalyst", Usage: "Catalyst mode (eth2 integration testing)", } + + HTTPRpcTimeoutFlag = cli.StringFlag{ + Name: "http.timeout", + Usage: "Sets rpc http request timeout", + Value: fmt.Sprint(ethconfig.Defaults.HTTPRpcTimeout.Nanoseconds(), "ns"), + } ) // MakeDataDir retrieves the currently requested data directory, terminating @@ -1600,6 +1606,19 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { cfg.EthDiscoveryURLs = SplitAndTrim(urls) } } + if ctx.GlobalIsSet(HTTPRpcTimeoutFlag.Name) { + arg := ctx.GlobalString(HTTPRpcTimeoutFlag.Name) + _, err := strconv.Atoi(arg) + if err == nil { + arg = arg + "ns" + } + timeout, err := time.ParseDuration(arg) + if err != nil { + log.Warn("Bad http.timeout setting", arg) + timeout = ethconfig.Defaults.HTTPRpcTimeout + } + cfg.HTTPRpcTimeout = timeout + } // Override any default configs for hard coded networks. switch { case ctx.GlobalBool(MainnetFlag.Name): diff --git a/eth/api_backend.go b/eth/api_backend.go index 49de70e21069e..cde05e3ac8647 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -20,6 +20,7 @@ import ( "context" "errors" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" @@ -353,3 +354,7 @@ func (b *EthAPIBackend) StateAtBlock(ctx context.Context, block *types.Block, re func (b *EthAPIBackend) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (core.Message, vm.BlockContext, *state.StateDB, error) { return b.eth.stateAtTransaction(block, txIndex, reexec) } + +func (b *EthAPIBackend) HTTPRpcTimeout() time.Duration { + return b.eth.config.HTTPRpcTimeout +} diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 89cdb75597e08..1e34a8e847ff9 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -87,10 +87,11 @@ var Defaults = Config{ GasPrice: big.NewInt(params.GWei), Recommit: 3 * time.Second, }, - TxPool: core.DefaultTxPoolConfig, - RPCGasCap: 50000000, - GPO: FullNodeGPO, - RPCTxFeeCap: 1, // 1 ether + TxPool: core.DefaultTxPoolConfig, + RPCGasCap: 50000000, + GPO: FullNodeGPO, + RPCTxFeeCap: 1, // 1 ether + HTTPRpcTimeout: time.Second * 5, } func init() { @@ -200,6 +201,9 @@ type Config struct { // Berlin block override (TODO: remove after the fork) OverrideLondon *big.Int `toml:",omitempty"` + + // Http Rpc request timeout. + HTTPRpcTimeout time.Duration } // CreateConsensusEngine creates a consensus engine for the given chain configuration. diff --git a/eth/ethconfig/gen_config.go b/eth/ethconfig/gen_config.go index 2310dd44997b6..fb86b36fff241 100644 --- a/eth/ethconfig/gen_config.go +++ b/eth/ethconfig/gen_config.go @@ -59,6 +59,7 @@ func (c Config) MarshalTOML() (interface{}, error) { Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` OverrideLondon *big.Int `toml:",omitempty"` + HTTPRpcTimeout time.Duration } var enc Config enc.Genesis = c.Genesis @@ -102,6 +103,7 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.Checkpoint = c.Checkpoint enc.CheckpointOracle = c.CheckpointOracle enc.OverrideLondon = c.OverrideLondon + enc.HTTPRpcTimeout = c.HTTPRpcTimeout return &enc, nil } @@ -149,6 +151,7 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` OverrideLondon *big.Int `toml:",omitempty"` + HTTPRpcTimeout *time.Duration } var dec Config if err := unmarshal(&dec); err != nil { @@ -277,5 +280,8 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.OverrideLondon != nil { c.OverrideLondon = dec.OverrideLondon } + if dec.HTTPRpcTimeout != nil { + c.HTTPRpcTimeout = *dec.HTTPRpcTimeout + } return nil } diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 9a82824ada14f..23a1a673f5d2a 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -40,6 +40,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/params" @@ -882,7 +883,6 @@ func (diff *StateOverride) Apply(state *state.StateDB) error { func DoCall(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, timeout time.Duration, globalGasCap uint64) (*core.ExecutionResult, error) { defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) - state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if state == nil || err != nil { return nil, err @@ -972,7 +972,11 @@ func (e *revertError) ErrorData() interface{} { // Note, this function doesn't make and changes in the state/blockchain and is // useful to execute and retrieve values. func (s *PublicBlockChainAPI) Call(ctx context.Context, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride) (hexutil.Bytes, error) { - result, err := DoCall(ctx, s.b, args, blockNrOrHash, overrides, 5*time.Second, s.b.RPCGasCap()) + timeout := s.b.HTTPRpcTimeout() + if timeout == 0 { + timeout = ethconfig.Defaults.HTTPRpcTimeout + } + result, err := DoCall(ctx, s.b, args, blockNrOrHash, overrides, timeout, s.b.RPCGasCap()) if err != nil { return nil, err } diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 9954545821932..f2c8b7a807a2b 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -20,6 +20,7 @@ package ethapi import ( "context" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" @@ -90,6 +91,8 @@ type Backend interface { ChainConfig() *params.ChainConfig Engine() consensus.Engine + + HTTPRpcTimeout() time.Duration } func GetAPIs(apiBackend Backend) []rpc.API { diff --git a/les/api_backend.go b/les/api_backend.go index 9c80270da0a11..3650caaf8ef85 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -20,6 +20,7 @@ import ( "context" "errors" "math/big" + "time" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" @@ -326,3 +327,7 @@ func (b *LesApiBackend) StateAtBlock(ctx context.Context, block *types.Block, re func (b *LesApiBackend) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (core.Message, vm.BlockContext, *state.StateDB, error) { return b.eth.stateAtTransaction(ctx, block, txIndex, reexec) } + +func (b *LesApiBackend) HTTPRpcTimeout() time.Duration { + return b.eth.config.HTTPRpcTimeout +} From aa040b33684cacf72f5b238b7f58f5993a8b7b85 Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 28 Aug 2021 22:36:47 -0400 Subject: [PATCH 2/5] cmd/geth, cmd/utils/flags, eth/ethconfig: add http rpc timeout option (#23416) --- cmd/utils/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index f3beb062d9d59..1c8c1e0d62150 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -778,7 +778,7 @@ var ( HTTPRpcTimeoutFlag = cli.StringFlag{ Name: "http.timeout", - Usage: "Sets rpc http request timeout", + Usage: "Sets http rpc request timeout", Value: fmt.Sprint(ethconfig.Defaults.HTTPRpcTimeout.Nanoseconds(), "ns"), } ) From 185cc18eb44b611f57bc35bdb5c5d9ac670d25df Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 29 Aug 2021 18:36:28 -0400 Subject: [PATCH 3/5] cmd/geth, cmd/utils/flags, eth/ethconfig: add http rpc timeout option (#23416) documentation update --- cmd/utils/flags.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 1c8c1e0d62150..a2742290ecbe5 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -778,7 +778,8 @@ var ( HTTPRpcTimeoutFlag = cli.StringFlag{ Name: "http.timeout", - Usage: "Sets http rpc request timeout", + Usage: "Sets http rpc request timeout (use \"s\" suffix for seconds, eg: --http.timeout 10s)", + // uses time.ParseDuration() which requires a unit suffix, "h", "m", "s", "ms" etc. Value: fmt.Sprint(ethconfig.Defaults.HTTPRpcTimeout.Nanoseconds(), "ns"), } ) From 663dc80fee92aa867bd80ba4c91e8811354a32bf Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 31 Aug 2021 12:19:17 -0400 Subject: [PATCH 4/5] cmd/utils/flags: use DurationFlag and default duration printer --- cmd/utils/flags.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index a2742290ecbe5..9816d19c45c4d 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -776,11 +776,11 @@ var ( Usage: "Catalyst mode (eth2 integration testing)", } - HTTPRpcTimeoutFlag = cli.StringFlag{ + HTTPRpcTimeoutFlag = cli.DurationFlag{ Name: "http.timeout", Usage: "Sets http rpc request timeout (use \"s\" suffix for seconds, eg: --http.timeout 10s)", // uses time.ParseDuration() which requires a unit suffix, "h", "m", "s", "ms" etc. - Value: fmt.Sprint(ethconfig.Defaults.HTTPRpcTimeout.Nanoseconds(), "ns"), + Value: ethconfig.Defaults.HTTPRpcTimeout, } ) From 15fae5dcef2d68f706a44b58b876b1e2823a0175 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 13 Sep 2021 14:50:45 -0400 Subject: [PATCH 5/5] cmd/utils/flags: remove comment --- cmd/utils/flags.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 9816d19c45c4d..e7ab77ac84acb 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -779,7 +779,6 @@ var ( HTTPRpcTimeoutFlag = cli.DurationFlag{ Name: "http.timeout", Usage: "Sets http rpc request timeout (use \"s\" suffix for seconds, eg: --http.timeout 10s)", - // uses time.ParseDuration() which requires a unit suffix, "h", "m", "s", "ms" etc. Value: ethconfig.Defaults.HTTPRpcTimeout, } )