Merge pull request #3870 from fikumikudev/prs/hinted-elections-2-1
Extract `election::cooldown_time` calculation
This commit is contained in:
		
				commit
				
					
						c57c4f8030
					
				
			
		
					 4 changed files with 35 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -212,7 +212,7 @@ bool nano::election::transition_time (nano::confirmation_solicitor & solicitor_a
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::chrono::milliseconds nano::election::time_to_live ()
 | 
			
		||||
std::chrono::milliseconds nano::election::time_to_live () const
 | 
			
		||||
{
 | 
			
		||||
	switch (behavior)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -221,7 +221,22 @@ std::chrono::milliseconds nano::election::time_to_live ()
 | 
			
		|||
		case election_behavior::hinted:
 | 
			
		||||
			return std::chrono::milliseconds (30 * 1000);
 | 
			
		||||
	}
 | 
			
		||||
	release_assert (false);
 | 
			
		||||
	return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::chrono::seconds nano::election::cooldown_time (nano::uint128_t weight) const
 | 
			
		||||
{
 | 
			
		||||
	auto online_stake = node.online_reps.trended ();
 | 
			
		||||
	if (weight > online_stake / 20) // Reps with more than 5% weight
 | 
			
		||||
	{
 | 
			
		||||
		return std::chrono::seconds{ 1 };
 | 
			
		||||
	}
 | 
			
		||||
	if (weight > online_stake / 100) // Reps with more than 1% weight
 | 
			
		||||
	{
 | 
			
		||||
		return std::chrono::seconds{ 5 };
 | 
			
		||||
	}
 | 
			
		||||
	// The rest of smaller reps
 | 
			
		||||
	return std::chrono::seconds{ 15 };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::election::have_quorum (nano::tally_t const & tally_a) const
 | 
			
		||||
| 
						 | 
				
			
			@ -351,25 +366,12 @@ std::shared_ptr<nano::block> nano::election::find (nano::block_hash const & hash
 | 
			
		|||
 | 
			
		||||
nano::election_vote_result nano::election::vote (nano::account const & rep, uint64_t timestamp_a, nano::block_hash const & block_hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto replay (false);
 | 
			
		||||
	auto online_stake (node.online_reps.trended ());
 | 
			
		||||
	auto weight (node.ledger.weight (rep));
 | 
			
		||||
	auto should_process (false);
 | 
			
		||||
	if (node.network_params.network.is_dev_network () || weight > node.minimum_principal_weight (online_stake))
 | 
			
		||||
	auto replay = false;
 | 
			
		||||
	auto weight = node.ledger.weight (rep);
 | 
			
		||||
	auto should_process = false;
 | 
			
		||||
	if (node.network_params.network.is_dev_network () || weight > node.minimum_principal_weight ())
 | 
			
		||||
	{
 | 
			
		||||
		unsigned int cooldown;
 | 
			
		||||
		if (weight < online_stake / 100) // 0.1% to 1%
 | 
			
		||||
		{
 | 
			
		||||
			cooldown = 15;
 | 
			
		||||
		}
 | 
			
		||||
		else if (weight < online_stake / 20) // 1% to 5%
 | 
			
		||||
		{
 | 
			
		||||
			cooldown = 5;
 | 
			
		||||
		}
 | 
			
		||||
		else // 5% or above
 | 
			
		||||
		{
 | 
			
		||||
			cooldown = 1;
 | 
			
		||||
		}
 | 
			
		||||
		const auto cooldown = cooldown_time (weight);
 | 
			
		||||
 | 
			
		||||
		nano::unique_lock<nano::mutex> lock (mutex);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,9 +101,14 @@ public: // Status
 | 
			
		|||
	nano::election_status status;
 | 
			
		||||
 | 
			
		||||
public: // Interface
 | 
			
		||||
	election (nano::node &, std::shared_ptr<nano::block> const &, std::function<void (std::shared_ptr<nano::block> const &)> const &, std::function<void (nano::account const &)> const &, nano::election_behavior);
 | 
			
		||||
	election (nano::node &, std::shared_ptr<nano::block> const & block, std::function<void (std::shared_ptr<nano::block> const &)> const & confirmation_action, std::function<void (nano::account const &)> const & vote_action, nano::election_behavior behavior);
 | 
			
		||||
 | 
			
		||||
	std::shared_ptr<nano::block> find (nano::block_hash const &) const;
 | 
			
		||||
	nano::election_vote_result vote (nano::account const &, uint64_t, nano::block_hash const &);
 | 
			
		||||
	/*
 | 
			
		||||
	 * Process vote. Internally uses cooldown to throttle non-final votes
 | 
			
		||||
	 * If the election reaches consensus, it will be confirmed
 | 
			
		||||
	 */
 | 
			
		||||
	nano::election_vote_result vote (nano::account const & representative, uint64_t timestamp, nano::block_hash const & block_hash);
 | 
			
		||||
	bool publish (std::shared_ptr<nano::block> const & block_a);
 | 
			
		||||
	std::size_t insert_inactive_votes_cache (nano::inactive_cache_information const &);
 | 
			
		||||
	// Confirm this block if quorum is met
 | 
			
		||||
| 
						 | 
				
			
			@ -126,7 +131,11 @@ private:
 | 
			
		|||
	void remove_votes (nano::block_hash const &);
 | 
			
		||||
	void remove_block (nano::block_hash const &);
 | 
			
		||||
	bool replace_by_weight (nano::unique_lock<nano::mutex> & lock_a, nano::block_hash const &);
 | 
			
		||||
	std::chrono::milliseconds time_to_live ();
 | 
			
		||||
	std::chrono::milliseconds time_to_live () const;
 | 
			
		||||
	/*
 | 
			
		||||
	 * Calculates minimum time delay between subsequent votes when processing non-final votes
 | 
			
		||||
	 */
 | 
			
		||||
	std::chrono::seconds cooldown_time (nano::uint128_t weight) const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	std::unordered_map<nano::block_hash, std::shared_ptr<nano::block>> last_blocks;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -809,12 +809,7 @@ nano::block_hash nano::node::rep_block (nano::account const & account_a)
 | 
			
		|||
 | 
			
		||||
nano::uint128_t nano::node::minimum_principal_weight ()
 | 
			
		||||
{
 | 
			
		||||
	return minimum_principal_weight (online_reps.trended ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::uint128_t nano::node::minimum_principal_weight (nano::uint128_t const & online_stake)
 | 
			
		||||
{
 | 
			
		||||
	return online_stake / network_params.network.principal_weight_factor;
 | 
			
		||||
	return online_reps.trended () / network_params.network.principal_weight_factor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::node::long_inactivity_cleanup ()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,7 +118,6 @@ public:
 | 
			
		|||
	nano::uint128_t weight (nano::account const &);
 | 
			
		||||
	nano::block_hash rep_block (nano::account const &);
 | 
			
		||||
	nano::uint128_t minimum_principal_weight ();
 | 
			
		||||
	nano::uint128_t minimum_principal_weight (nano::uint128_t const &);
 | 
			
		||||
	void ongoing_rep_calculation ();
 | 
			
		||||
	void ongoing_bootstrap ();
 | 
			
		||||
	void ongoing_peer_store ();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue