Make all Poisson delays use std::chrono types
This commit is contained in:
1 parent
c733ac4d8a
commit
55e82881a1
6 files changed
+47
-63
No files matched your search
+15
-15
@@ -1761,12 +1761,11 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initiate network connections
|
// Initiate network connections
|
||||||
auto start = GetTime<std::chrono::seconds>();
|
auto start = GetTime<std::chrono::microseconds>();
|
||||||
|
|
||||||
// Minimum time before next feeler connection (in microseconds).
|
// Minimum time before next feeler connection (in microseconds).
|
||||||
|
auto next_feeler = PoissonNextSend(start, FEELER_INTERVAL);
|
||||||
int64_t nNextFeeler = PoissonNextSend(count_microseconds(start), FEELER_INTERVAL);
|
auto next_extra_block_relay = PoissonNextSend(start, EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
|
||||||
int64_t nNextExtraBlockRelay = PoissonNextSend(count_microseconds(start), EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL);
|
|
||||||
const bool dnsseed = gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED);
|
const bool dnsseed = gArgs.GetBoolArg("-dnsseed", DEFAULT_DNSSEED);
|
||||||
bool add_fixed_seeds = gArgs.GetBoolArg("-fixedseeds", DEFAULT_FIXEDSEEDS);
|
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;
|
ConnectionType conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
|
||||||
int64_t nTime = GetTimeMicros();
|
auto now = GetTime<std::chrono::microseconds>();
|
||||||
bool anchor = false;
|
bool anchor = false;
|
||||||
bool fFeeler = 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
|
// GetTryNewOutboundPeer() gets set when a stale tip is detected, so we
|
||||||
// try opening an additional OUTBOUND_FULL_RELAY connection. If none of
|
// 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
|
// 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.
|
// timer to decide if we should open a FEELER.
|
||||||
|
|
||||||
if (!m_anchors.empty() && (nOutboundBlockRelay < m_max_outbound_block_relay)) {
|
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;
|
conn_type = ConnectionType::BLOCK_RELAY;
|
||||||
} else if (GetTryNewOutboundPeer()) {
|
} else if (GetTryNewOutboundPeer()) {
|
||||||
// OUTBOUND_FULL_RELAY
|
// 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
|
// Periodically connect to a peer (using regular outbound selection
|
||||||
// methodology from addrman) and stay connected long enough to sync
|
// methodology from addrman) and stay connected long enough to sync
|
||||||
// headers, but not much else.
|
// 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
|
// Because we can promote these connections to block-relay-only
|
||||||
// connections, they do not get their own ConnectionType enum
|
// connections, they do not get their own ConnectionType enum
|
||||||
// (similar to how we deal with extra outbound peers).
|
// (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;
|
conn_type = ConnectionType::BLOCK_RELAY;
|
||||||
} else if (nTime > nNextFeeler) {
|
} else if (now > next_feeler) {
|
||||||
nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);
|
next_feeler = PoissonNextSend(now, FEELER_INTERVAL);
|
||||||
conn_type = ConnectionType::FEELER;
|
conn_type = ConnectionType::FEELER;
|
||||||
fFeeler = true;
|
fFeeler = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -2983,20 +2982,21 @@ bool CConnman::ForNode(NodeId id, std::function<bool(CNode* pnode)> func)
|
|||||||
return found != nullptr && NodeFullyConnected(found) && func(found);
|
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
|
// 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.
|
// 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.
|
// 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;
|
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
|
CSipHasher CConnman::GetDeterministicRandomizer(uint64_t id) const
|
||||||
|
|||||||
@@ -49,10 +49,10 @@ static const bool DEFAULT_WHITELISTFORCERELAY = false;
|
|||||||
|
|
||||||
/** Time after which to disconnect, after waiting for a ping response (or inactivity). */
|
/** Time after which to disconnect, after waiting for a ping response (or inactivity). */
|
||||||
static const int TIMEOUT_INTERVAL = 20 * 60;
|
static const int TIMEOUT_INTERVAL = 20 * 60;
|
||||||
/** Run the feeler connection loop once every 2 minutes or 120 seconds. **/
|
/** Run the feeler connection loop once every 2 minutes. **/
|
||||||
static const int FEELER_INTERVAL = 120;
|
static constexpr auto FEELER_INTERVAL = 2min;
|
||||||
/** Run the extra block-relay-only connection loop once every 5 minutes. **/
|
/** Run the extra block-relay-only connection loop once every 5 minutes. **/
|
||||||
static const int EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL = 300;
|
static constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL = 5min;
|
||||||
/** The maximum number of addresses from our addrman to return in response to a getaddr message. */
|
/** The maximum number of addresses from our addrman to return in response to a getaddr message. */
|
||||||
static constexpr size_t MAX_ADDR_TO_SEND = 1000;
|
static constexpr size_t MAX_ADDR_TO_SEND = 1000;
|
||||||
/** Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable). */
|
/** Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable). */
|
||||||
@@ -573,7 +573,7 @@ public:
|
|||||||
/** Minimum fee rate with which to filter inv's to this node */
|
/** Minimum fee rate with which to filter inv's to this node */
|
||||||
std::atomic<CAmount> minFeeFilter{0};
|
std::atomic<CAmount> minFeeFilter{0};
|
||||||
CAmount lastSentFeeFilter{0};
|
CAmount lastSentFeeFilter{0};
|
||||||
int64_t nextSendTimeFeeFilter{0};
|
std::chrono::microseconds m_next_send_feefilter{0};
|
||||||
};
|
};
|
||||||
|
|
||||||
// m_tx_relay == nullptr if we're not relaying transactions with this peer
|
// m_tx_relay == nullptr if we're not relaying transactions with this peer
|
||||||
@@ -1021,7 +1021,7 @@ public:
|
|||||||
Works assuming that a single interval is used.
|
Works assuming that a single interval is used.
|
||||||
Variable intervals will result in privacy decrease.
|
Variable intervals will result in privacy decrease.
|
||||||
*/
|
*/
|
||||||
int64_t PoissonNextSendInbound(int64_t now, int average_interval_seconds);
|
std::chrono::microseconds PoissonNextSendInbound(std::chrono::microseconds now, std::chrono::seconds average_interval);
|
||||||
|
|
||||||
void SetAsmap(std::vector<bool> asmap) { addrman.m_asmap = std::move(asmap); }
|
void SetAsmap(std::vector<bool> asmap) { addrman.m_asmap = std::move(asmap); }
|
||||||
|
|
||||||
@@ -1256,7 +1256,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
std::atomic_bool m_start_extra_block_relay_peers{false};
|
std::atomic_bool m_start_extra_block_relay_peers{false};
|
||||||
|
|
||||||
std::atomic<int64_t> m_next_send_inv_to_incoming{0};
|
std::atomic<std::chrono::microseconds> m_next_send_inv_to_incoming{0us};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A vector of -bind=<address>:<port>=onion arguments each of which is
|
* A vector of -bind=<address>:<port>=onion arguments each of which is
|
||||||
@@ -1269,13 +1269,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/** Return a timestamp in the future (in microseconds) for exponentially distributed events. */
|
/** Return a timestamp in the future (in microseconds) for exponentially distributed events. */
|
||||||
int64_t PoissonNextSend(int64_t now, int average_interval_seconds);
|
std::chrono::microseconds PoissonNextSend(std::chrono::microseconds now, std::chrono::seconds average_interval);
|
||||||
|
|
||||||
/** Wrapper to return mockable type */
|
|
||||||
inline std::chrono::microseconds PoissonNextSend(std::chrono::microseconds now, std::chrono::seconds average_interval)
|
|
||||||
{
|
|
||||||
return std::chrono::microseconds{PoissonNextSend(now.count(), average_interval.count())};
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Dump binary message to file, with timestamp */
|
/** Dump binary message to file, with timestamp */
|
||||||
void CaptureMessage(const CAddress& addr, const std::string& msg_type, const Span<const unsigned char>& data, bool is_incoming);
|
void CaptureMessage(const CAddress& addr, const std::string& msg_type, const Span<const unsigned char>& data, bool is_incoming);
|
||||||
|
|||||||
+19
-16
@@ -119,17 +119,21 @@ static const int MAX_UNCONNECTING_HEADERS = 10;
|
|||||||
/** Minimum blocks required to signal NODE_NETWORK_LIMITED */
|
/** Minimum blocks required to signal NODE_NETWORK_LIMITED */
|
||||||
static const unsigned int NODE_NETWORK_LIMITED_MIN_BLOCKS = 288;
|
static const unsigned int NODE_NETWORK_LIMITED_MIN_BLOCKS = 288;
|
||||||
/** Average delay between local address broadcasts */
|
/** Average delay between local address broadcasts */
|
||||||
static constexpr std::chrono::hours AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL{24};
|
static constexpr auto AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL = 24h;
|
||||||
/** Average delay between peer address broadcasts */
|
/** Average delay between peer address broadcasts */
|
||||||
static constexpr std::chrono::seconds AVG_ADDRESS_BROADCAST_INTERVAL{30};
|
static constexpr auto AVG_ADDRESS_BROADCAST_INTERVAL = 30s;
|
||||||
/** Average delay between trickled inventory transmissions in seconds.
|
/** Average delay between trickled inventory transmissions for inbound peers.
|
||||||
* Blocks and peers with noban permission bypass this, outbound peers get half this delay. */
|
* Blocks and peers with noban permission bypass this. */
|
||||||
static const unsigned int INVENTORY_BROADCAST_INTERVAL = 5;
|
static constexpr auto INBOUND_INVENTORY_BROADCAST_INTERVAL = 5s;
|
||||||
|
/** Average delay between trickled inventory transmissions for outbound peers.
|
||||||
|
* Use a smaller delay as there is less privacy concern for them.
|
||||||
|
* Blocks and peers with noban permission bypass this. */
|
||||||
|
static constexpr auto OUTBOUND_INVENTORY_BROADCAST_INTERVAL = 2s;
|
||||||
/** Maximum rate of inventory items to send per second.
|
/** Maximum rate of inventory items to send per second.
|
||||||
* Limits the impact of low-fee transaction floods. */
|
* Limits the impact of low-fee transaction floods. */
|
||||||
static constexpr unsigned int INVENTORY_BROADCAST_PER_SECOND = 7;
|
static constexpr unsigned int INVENTORY_BROADCAST_PER_SECOND = 7;
|
||||||
/** Maximum number of inventory items to send per transmission. */
|
/** Maximum number of inventory items to send per transmission. */
|
||||||
static constexpr unsigned int INVENTORY_BROADCAST_MAX = INVENTORY_BROADCAST_PER_SECOND * INVENTORY_BROADCAST_INTERVAL;
|
static constexpr unsigned int INVENTORY_BROADCAST_MAX = INVENTORY_BROADCAST_PER_SECOND * count_seconds(INBOUND_INVENTORY_BROADCAST_INTERVAL);
|
||||||
/** The number of most recently announced transactions a peer can request. */
|
/** The number of most recently announced transactions a peer can request. */
|
||||||
static constexpr unsigned int INVENTORY_MAX_RECENT_RELAY = 3500;
|
static constexpr unsigned int INVENTORY_MAX_RECENT_RELAY = 3500;
|
||||||
/** Verify that INVENTORY_MAX_RECENT_RELAY is enough to cache everything typically
|
/** Verify that INVENTORY_MAX_RECENT_RELAY is enough to cache everything typically
|
||||||
@@ -138,9 +142,9 @@ static constexpr unsigned int INVENTORY_MAX_RECENT_RELAY = 3500;
|
|||||||
* peers, and random variations in the broadcast mechanism. */
|
* peers, and random variations in the broadcast mechanism. */
|
||||||
static_assert(INVENTORY_MAX_RECENT_RELAY >= INVENTORY_BROADCAST_PER_SECOND * UNCONDITIONAL_RELAY_DELAY / std::chrono::seconds{1}, "INVENTORY_RELAY_MAX too low");
|
static_assert(INVENTORY_MAX_RECENT_RELAY >= INVENTORY_BROADCAST_PER_SECOND * UNCONDITIONAL_RELAY_DELAY / std::chrono::seconds{1}, "INVENTORY_RELAY_MAX too low");
|
||||||
/** Average delay between feefilter broadcasts in seconds. */
|
/** Average delay between feefilter broadcasts in seconds. */
|
||||||
static constexpr unsigned int AVG_FEEFILTER_BROADCAST_INTERVAL = 10 * 60;
|
static constexpr auto AVG_FEEFILTER_BROADCAST_INTERVAL = 10min;
|
||||||
/** Maximum feefilter broadcast delay after significant change. */
|
/** Maximum feefilter broadcast delay after significant change. */
|
||||||
static constexpr unsigned int MAX_FEEFILTER_CHANGE_DELAY = 5 * 60;
|
static constexpr auto MAX_FEEFILTER_CHANGE_DELAY = 5min;
|
||||||
/** Maximum number of compact filters that may be requested with one getcfilters. See BIP 157. */
|
/** Maximum number of compact filters that may be requested with one getcfilters. See BIP 157. */
|
||||||
static constexpr uint32_t MAX_GETCFILTERS_SIZE = 1000;
|
static constexpr uint32_t MAX_GETCFILTERS_SIZE = 1000;
|
||||||
/** Maximum number of cf hashes that may be requested with one getcfheaders. See BIP 157. */
|
/** Maximum number of cf hashes that may be requested with one getcfheaders. See BIP 157. */
|
||||||
@@ -4669,10 +4673,9 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
if (pto->m_tx_relay->nNextInvSend < current_time) {
|
if (pto->m_tx_relay->nNextInvSend < current_time) {
|
||||||
fSendTrickle = true;
|
fSendTrickle = true;
|
||||||
if (pto->IsInboundConn()) {
|
if (pto->IsInboundConn()) {
|
||||||
pto->m_tx_relay->nNextInvSend = std::chrono::microseconds{m_connman.PoissonNextSendInbound(count_microseconds(current_time), INVENTORY_BROADCAST_INTERVAL)};
|
pto->m_tx_relay->nNextInvSend = m_connman.PoissonNextSendInbound(current_time, INBOUND_INVENTORY_BROADCAST_INTERVAL);
|
||||||
} else {
|
} else {
|
||||||
// Use half the delay for outbound peers, as there is less privacy concern for them.
|
pto->m_tx_relay->nNextInvSend = PoissonNextSend(current_time, OUTBOUND_INVENTORY_BROADCAST_INTERVAL);
|
||||||
pto->m_tx_relay->nNextInvSend = PoissonNextSend(current_time, std::chrono::seconds{INVENTORY_BROADCAST_INTERVAL >> 1});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4927,10 +4930,10 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
if (pto->m_tx_relay->lastSentFeeFilter == MAX_FILTER) {
|
if (pto->m_tx_relay->lastSentFeeFilter == MAX_FILTER) {
|
||||||
// Send the current filter if we sent MAX_FILTER previously
|
// Send the current filter if we sent MAX_FILTER previously
|
||||||
// and made it out of IBD.
|
// and made it out of IBD.
|
||||||
pto->m_tx_relay->nextSendTimeFeeFilter = count_microseconds(current_time) - 1;
|
pto->m_tx_relay->m_next_send_feefilter = 0us;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (count_microseconds(current_time) > pto->m_tx_relay->nextSendTimeFeeFilter) {
|
if (current_time > pto->m_tx_relay->m_next_send_feefilter) {
|
||||||
CAmount filterToSend = g_filter_rounder.round(currentFilter);
|
CAmount filterToSend = g_filter_rounder.round(currentFilter);
|
||||||
// We always have a fee filter of at least minRelayTxFee
|
// We always have a fee filter of at least minRelayTxFee
|
||||||
filterToSend = std::max(filterToSend, ::minRelayTxFee.GetFeePerK());
|
filterToSend = std::max(filterToSend, ::minRelayTxFee.GetFeePerK());
|
||||||
@@ -4938,13 +4941,13 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
m_connman.PushMessage(pto, msgMaker.Make(NetMsgType::FEEFILTER, filterToSend));
|
m_connman.PushMessage(pto, msgMaker.Make(NetMsgType::FEEFILTER, filterToSend));
|
||||||
pto->m_tx_relay->lastSentFeeFilter = filterToSend;
|
pto->m_tx_relay->lastSentFeeFilter = filterToSend;
|
||||||
}
|
}
|
||||||
pto->m_tx_relay->nextSendTimeFeeFilter = PoissonNextSend(count_microseconds(current_time), AVG_FEEFILTER_BROADCAST_INTERVAL);
|
pto->m_tx_relay->m_next_send_feefilter = PoissonNextSend(current_time, AVG_FEEFILTER_BROADCAST_INTERVAL);
|
||||||
}
|
}
|
||||||
// If the fee filter has changed substantially and it's still more than MAX_FEEFILTER_CHANGE_DELAY
|
// If the fee filter has changed substantially and it's still more than MAX_FEEFILTER_CHANGE_DELAY
|
||||||
// until scheduled broadcast, then move the broadcast to within MAX_FEEFILTER_CHANGE_DELAY.
|
// until scheduled broadcast, then move the broadcast to within MAX_FEEFILTER_CHANGE_DELAY.
|
||||||
else if (count_microseconds(current_time) + MAX_FEEFILTER_CHANGE_DELAY * 1000000 < pto->m_tx_relay->nextSendTimeFeeFilter &&
|
else if (current_time + MAX_FEEFILTER_CHANGE_DELAY < pto->m_tx_relay->m_next_send_feefilter &&
|
||||||
(currentFilter < 3 * pto->m_tx_relay->lastSentFeeFilter / 4 || currentFilter > 4 * pto->m_tx_relay->lastSentFeeFilter / 3)) {
|
(currentFilter < 3 * pto->m_tx_relay->lastSentFeeFilter / 4 || currentFilter > 4 * pto->m_tx_relay->lastSentFeeFilter / 3)) {
|
||||||
pto->m_tx_relay->nextSendTimeFeeFilter = count_microseconds(current_time) + GetRandInt(MAX_FEEFILTER_CHANGE_DELAY) * 1000000;
|
pto->m_tx_relay->m_next_send_feefilter = current_time + GetRandomDuration<std::chrono::microseconds>(MAX_FEEFILTER_CHANGE_DELAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // release cs_main
|
} // release cs_main
|
||||||
|
|||||||
@@ -104,7 +104,9 @@ FUZZ_TARGET_INIT(connman, initialize_connman)
|
|||||||
},
|
},
|
||||||
[&] {
|
[&] {
|
||||||
// Limit now to int32_t to avoid signed integer overflow
|
// Limit now to int32_t to avoid signed integer overflow
|
||||||
(void)connman.PoissonNextSendInbound(fuzzed_data_provider.ConsumeIntegral<int32_t>(), fuzzed_data_provider.ConsumeIntegral<int>());
|
(void)connman.PoissonNextSendInbound(
|
||||||
|
std::chrono::microseconds{fuzzed_data_provider.ConsumeIntegral<int32_t>()},
|
||||||
|
std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<int>()});
|
||||||
},
|
},
|
||||||
[&] {
|
[&] {
|
||||||
CSerializedNetMsg serialized_net_msg;
|
CSerializedNetMsg serialized_net_msg;
|
||||||
|
|||||||
@@ -803,21 +803,6 @@ BOOST_AUTO_TEST_CASE(LocalAddress_BasicLifecycle)
|
|||||||
BOOST_CHECK_EQUAL(IsLocal(addr), false);
|
BOOST_CHECK_EQUAL(IsLocal(addr), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(PoissonNextSend)
|
|
||||||
{
|
|
||||||
g_mock_deterministic_tests = true;
|
|
||||||
|
|
||||||
int64_t now = 5000;
|
|
||||||
int average_interval_seconds = 600;
|
|
||||||
|
|
||||||
auto poisson = ::PoissonNextSend(now, average_interval_seconds);
|
|
||||||
std::chrono::microseconds poisson_chrono = ::PoissonNextSend(std::chrono::microseconds{now}, std::chrono::seconds{average_interval_seconds});
|
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL(poisson, poisson_chrono.count());
|
|
||||||
|
|
||||||
g_mock_deterministic_tests = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(const int n_candidates, FastRandomContext& random_context)
|
std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(const int n_candidates, FastRandomContext& random_context)
|
||||||
{
|
{
|
||||||
std::vector<NodeEvictionCandidate> candidates;
|
std::vector<NodeEvictionCandidate> candidates;
|
||||||
|
|||||||
+3
-3
@@ -26,9 +26,9 @@ void UninterruptibleSleep(const std::chrono::microseconds& n);
|
|||||||
* This helper is used to convert durations before passing them over an
|
* This helper is used to convert durations before passing them over an
|
||||||
* interface that doesn't support std::chrono (e.g. RPC, debug log, or the GUI)
|
* interface that doesn't support std::chrono (e.g. RPC, debug log, or the GUI)
|
||||||
*/
|
*/
|
||||||
inline int64_t count_seconds(std::chrono::seconds t) { return t.count(); }
|
constexpr int64_t count_seconds(std::chrono::seconds t) { return t.count(); }
|
||||||
inline int64_t count_milliseconds(std::chrono::milliseconds t) { return t.count(); }
|
constexpr int64_t count_milliseconds(std::chrono::milliseconds t) { return t.count(); }
|
||||||
inline int64_t count_microseconds(std::chrono::microseconds t) { return t.count(); }
|
constexpr int64_t count_microseconds(std::chrono::microseconds t) { return t.count(); }
|
||||||
|
|
||||||
using SecondsDouble = std::chrono::duration<double, std::chrono::seconds::period>;
|
using SecondsDouble = std::chrono::duration<double, std::chrono::seconds::period>;
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user