Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

remove speculation when stale #4649

Merged

Conversation

wanderingbort
Copy link
Contributor

in the current default mode, a node attempts to act as a good p2p citizen and relay transactions. This requires creating a speculative block. However, in times when a network has steady transactions and the node is stale, this creates a storm of database activity managing our transaction deduplication list as "time" bounces from current for speculation to stale for applying incoming blocks.

The new default is to only open a speculative block when the node is in sync. If transactions come in while the node is out of sync they are queued instead of immidiately executed and relayed. The result is a significant speed up when syncing in to a live network with some traffic on it.

The old default can be restored by using the new enable-stale-speculation config parameter

in the current default mode, a node attempts to act as a good p2p citizen and relay transactions.  This requires creating a speculative block.  However, in times when a network has steady transactions and the node is stale, this creates a storm of database activity managing our transaction deduplication list as "time" bounces from current for speculation to stale for applying incoming blocks.

The new default is to only open a speculative block when the node is in sync.  If transactions come in while the node is out of sync they are queued instead of immidiately executed and relayed.  The result is a significant speed up when syncing in to a live network with some traffic on it.

The old default can be restored by using the new `enable-stale-speculation` config parameter
@wanderingbort wanderingbort added this to the Version 1.1 milestone Jul 13, 2018
@@ -416,6 +424,7 @@ void producer_plugin::set_program_options(

producer_options.add_options()
("enable-stale-production,e", boost::program_options::bool_switch()->notifier([this](bool e){my->_production_enabled = e;}), "Enable block production, even if the chain is stale.")
("enable-stale-speculation", boost::program_options::bool_switch()->notifier([this](bool e){my->_enable_stale_speculation = e;}), "Enable speculative execution and relay, even if the chain is stale.")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see any reason to include this option.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm leaning towards agreeing. It is only present to maintain the original default functionality however, there seems to be almost zero value in that mode of operation.

@heifner heifner merged commit ede9b25 into EOSIO:release/1.1 Jul 14, 2018
wanderingbort pushed a commit to wanderingbort/eos that referenced this pull request Jul 17, 2018
Previously, we based the stale speculation check on the `_production_enabled` flag which is set, at most, once per process.  This lead to a situation where a node which fell behind would still speculate.  This changes that check to be based on the age of the head block so, nodes which fall behind will stop speculating.  NOTE, this only affects speculative modes, actual production should attempt to proceed despite the age of the head block.

relates to EOSIO#4649
# for free to subscribe to this conversation on GitHub. Already have an account? #.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants