mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 22:50:59 +01:00
Make all Poisson delays use std::chrono types
This commit is contained in:
committed by
Dhruv Mehta
parent
c733ac4d8a
commit
55e82881a1
30
src/net.cpp
30
src/net.cpp
@@ -1761,12 +1761,11 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
||||
}
|
||||
|
||||
// Initiate network connections
|
||||
auto start = GetTime<std::chrono::seconds>();
|
||||
auto start = GetTime<std::chrono::microseconds>();
|
||||
|
||||
// Minimum time before next feeler connection (in microseconds).
|
||||
|
||||
int64_t nNextFeeler = PoissonNextSend(count_microseconds(start), FEELER_INTERVAL);
|
||||
int64_t nNextExtraBlockRelay = PoissonNextSend(count_microseconds(start), EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
|
||||
auto next_feeler = PoissonNextSend(start, FEELER_INTERVAL);
|
||||
auto next_extra_block_relay = PoissonNextSend(start, EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
|
||||
const bool dnsseed = gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED);
|
||||
bool add_fixed_seeds = gArgs.GetBoolArg("-fixedseeds", DEFAULT_FIXEDSEEDS);
|
||||
|
||||
@@ -1849,7 +1848,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
||||
}
|
||||
|
||||
ConnectionType conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
|
||||
int64_t nTime = GetTimeMicros();
|
||||
auto now = GetTime<std::chrono::microseconds>();
|
||||
bool anchor = false;
|
||||
bool fFeeler = false;
|
||||
|
||||
@@ -1861,7 +1860,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
||||
// GetTryNewOutboundPeer() gets set when a stale tip is detected, so we
|
||||
// try opening an additional OUTBOUND_FULL_RELAY connection. If none of
|
||||
// these conditions are met, check to see if it's time to try an extra
|
||||
// block-relay-only peer (to confirm our tip is current, see below) or the nNextFeeler
|
||||
// block-relay-only peer (to confirm our tip is current, see below) or the next_feeler
|
||||
// timer to decide if we should open a FEELER.
|
||||
|
||||
if (!m_anchors.empty() && (nOutboundBlockRelay < m_max_outbound_block_relay)) {
|
||||
@@ -1873,7 +1872,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
||||
conn_type = ConnectionType::BLOCK_RELAY;
|
||||
} else if (GetTryNewOutboundPeer()) {
|
||||
// OUTBOUND_FULL_RELAY
|
||||
} else if (nTime > nNextExtraBlockRelay && m_start_extra_block_relay_peers) {
|
||||
} else if (now > next_extra_block_relay && m_start_extra_block_relay_peers) {
|
||||
// Periodically connect to a peer (using regular outbound selection
|
||||
// methodology from addrman) and stay connected long enough to sync
|
||||
// headers, but not much else.
|
||||
@@ -1895,10 +1894,10 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
||||
// Because we can promote these connections to block-relay-only
|
||||
// connections, they do not get their own ConnectionType enum
|
||||
// (similar to how we deal with extra outbound peers).
|
||||
nNextExtraBlockRelay = PoissonNextSend(nTime, EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
|
||||
next_extra_block_relay = PoissonNextSend(now, EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
|
||||
conn_type = ConnectionType::BLOCK_RELAY;
|
||||
} else if (nTime > nNextFeeler) {
|
||||
nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);
|
||||
} else if (now > next_feeler) {
|
||||
next_feeler = PoissonNextSend(now, FEELER_INTERVAL);
|
||||
conn_type = ConnectionType::FEELER;
|
||||
fFeeler = true;
|
||||
} else {
|
||||
@@ -2983,20 +2982,21 @@ bool CConnman::ForNode(NodeId id, std::function<bool(CNode* pnode)> func)
|
||||
return found != nullptr && NodeFullyConnected(found) && func(found);
|
||||
}
|
||||
|
||||
int64_t CConnman::PoissonNextSendInbound(int64_t now, int average_interval_seconds)
|
||||
std::chrono::microseconds CConnman::PoissonNextSendInbound(std::chrono::microseconds now, std::chrono::seconds average_interval)
|
||||
{
|
||||
if (m_next_send_inv_to_incoming < now) {
|
||||
if (m_next_send_inv_to_incoming.load() < now) {
|
||||
// If this function were called from multiple threads simultaneously
|
||||
// it would possible that both update the next send variable, and return a different result to their caller.
|
||||
// This is not possible in practice as only the net processing thread invokes this function.
|
||||
m_next_send_inv_to_incoming = PoissonNextSend(now, average_interval_seconds);
|
||||
m_next_send_inv_to_incoming = PoissonNextSend(now, average_interval);
|
||||
}
|
||||
return m_next_send_inv_to_incoming;
|
||||
}
|
||||
|
||||
int64_t PoissonNextSend(int64_t now, int average_interval_seconds)
|
||||
std::chrono::microseconds PoissonNextSend(std::chrono::microseconds now, std::chrono::seconds average_interval)
|
||||
{
|
||||
return now + (int64_t)(log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */) * average_interval_seconds * -1000000.0 + 0.5);
|
||||
double unscaled = -log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */);
|
||||
return now + std::chrono::duration_cast<std::chrono::microseconds>(unscaled * average_interval + 0.5us);
|
||||
}
|
||||
|
||||
CSipHasher CConnman::GetDeterministicRandomizer(uint64_t id) const
|
||||
|
||||
Reference in New Issue
Block a user