mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 04:22:55 +01:00
merge bitcoin#23758: Use type-safe mockable time for peer connection time
This commit is contained in:
parent
7beeae77b9
commit
6e6c9442fa
@ -43,7 +43,7 @@ static void EvictionProtection0Networks250Candidates(benchmark::Bench& bench)
|
|||||||
bench,
|
bench,
|
||||||
250 /* num_candidates */,
|
250 /* num_candidates */,
|
||||||
[](NodeEvictionCandidate& c) {
|
[](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_network = NET_IPV4;
|
c.m_network = NET_IPV4;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -54,7 +54,7 @@ static void EvictionProtection1Networks250Candidates(benchmark::Bench& bench)
|
|||||||
bench,
|
bench,
|
||||||
250 /* num_candidates */,
|
250 /* num_candidates */,
|
||||||
[](NodeEvictionCandidate& c) {
|
[](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
if (c.id >= 130 && c.id < 240) { // 110 Tor
|
if (c.id >= 130 && c.id < 240) { // 110 Tor
|
||||||
c.m_network = NET_ONION;
|
c.m_network = NET_ONION;
|
||||||
@ -70,7 +70,7 @@ static void EvictionProtection2Networks250Candidates(benchmark::Bench& bench)
|
|||||||
bench,
|
bench,
|
||||||
250 /* num_candidates */,
|
250 /* num_candidates */,
|
||||||
[](NodeEvictionCandidate& c) {
|
[](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
if (c.id >= 90 && c.id < 160) { // 70 Tor
|
if (c.id >= 90 && c.id < 160) { // 70 Tor
|
||||||
c.m_network = NET_ONION;
|
c.m_network = NET_ONION;
|
||||||
@ -88,7 +88,7 @@ static void EvictionProtection3Networks050Candidates(benchmark::Bench& bench)
|
|||||||
bench,
|
bench,
|
||||||
50 /* num_candidates */,
|
50 /* num_candidates */,
|
||||||
[](NodeEvictionCandidate& c) {
|
[](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 28 || c.id == 47); // 2 localhost
|
c.m_is_local = (c.id == 28 || c.id == 47); // 2 localhost
|
||||||
if (c.id >= 30 && c.id < 47) { // 17 I2P
|
if (c.id >= 30 && c.id < 47) { // 17 I2P
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -106,7 +106,7 @@ static void EvictionProtection3Networks100Candidates(benchmark::Bench& bench)
|
|||||||
bench,
|
bench,
|
||||||
100 /* num_candidates */,
|
100 /* num_candidates */,
|
||||||
[](NodeEvictionCandidate& c) {
|
[](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id >= 55 && c.id < 60); // 5 localhost
|
c.m_is_local = (c.id >= 55 && c.id < 60); // 5 localhost
|
||||||
if (c.id >= 70 && c.id < 80) { // 10 I2P
|
if (c.id >= 70 && c.id < 80) { // 10 I2P
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -124,7 +124,7 @@ static void EvictionProtection3Networks250Candidates(benchmark::Bench& bench)
|
|||||||
bench,
|
bench,
|
||||||
250 /* num_candidates */,
|
250 /* num_candidates */,
|
||||||
[](NodeEvictionCandidate& c) {
|
[](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id >= 140 && c.id < 160); // 20 localhost
|
c.m_is_local = (c.id >= 140 && c.id < 160); // 20 localhost
|
||||||
if (c.id >= 170 && c.id < 180) { // 10 I2P
|
if (c.id >= 170 && c.id < 180) { // 10 I2P
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
|
@ -49,7 +49,7 @@ void CMasternodeUtils::DoMaintenance(CConnman& connman, CDeterministicMNManager&
|
|||||||
connman.ForEachNode(CConnman::AllNodes, [&](CNode* pnode) {
|
connman.ForEachNode(CConnman::AllNodes, [&](CNode* pnode) {
|
||||||
if (pnode->m_masternode_probe_connection) {
|
if (pnode->m_masternode_probe_connection) {
|
||||||
// we're not disconnecting masternode probes for at least PROBE_WAIT_INTERVAL seconds
|
// we're not disconnecting masternode probes for at least PROBE_WAIT_INTERVAL seconds
|
||||||
if (GetTimeSeconds() - pnode->nTimeConnected < PROBE_WAIT_INTERVAL) return;
|
if (GetTime<std::chrono::seconds>() - pnode->m_connected < PROBE_WAIT_INTERVAL) return;
|
||||||
} else {
|
} else {
|
||||||
// we're only disconnecting m_masternode_connection connections
|
// we're only disconnecting m_masternode_connection connections
|
||||||
if (!pnode->m_masternode_connection) return;
|
if (!pnode->m_masternode_connection) return;
|
||||||
@ -67,7 +67,7 @@ void CMasternodeUtils::DoMaintenance(CConnman& connman, CDeterministicMNManager&
|
|||||||
if (pnode->IsInboundConn()) {
|
if (pnode->IsInboundConn()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (GetTimeSeconds() - pnode->nTimeConnected < 5) {
|
} else if (GetTime<std::chrono::seconds>() - pnode->m_connected < 5s) {
|
||||||
// non-verified, give it some time to verify itself
|
// non-verified, give it some time to verify itself
|
||||||
return;
|
return;
|
||||||
} else if (pnode->qwatch) {
|
} else if (pnode->qwatch) {
|
||||||
|
36
src/net.cpp
36
src/net.cpp
@ -704,9 +704,9 @@ void CNode::CopyStats(CNodeStats& stats)
|
|||||||
stats.m_network = ConnectedThroughNetwork();
|
stats.m_network = ConnectedThroughNetwork();
|
||||||
X(m_last_send);
|
X(m_last_send);
|
||||||
X(m_last_recv);
|
X(m_last_recv);
|
||||||
X(nLastTXTime);
|
X(m_last_tx_time);
|
||||||
X(nLastBlockTime);
|
X(m_last_block_time);
|
||||||
X(nTimeConnected);
|
X(m_connected);
|
||||||
X(nTimeOffset);
|
X(nTimeOffset);
|
||||||
X(m_addr_name);
|
X(m_addr_name);
|
||||||
X(nVersion);
|
X(nVersion);
|
||||||
@ -972,7 +972,7 @@ static bool ReverseCompareNodeMinPingTime(const NodeEvictionCandidate& a, const
|
|||||||
|
|
||||||
static bool ReverseCompareNodeTimeConnected(const NodeEvictionCandidate& a, const NodeEvictionCandidate& b)
|
static bool ReverseCompareNodeTimeConnected(const NodeEvictionCandidate& a, const NodeEvictionCandidate& b)
|
||||||
{
|
{
|
||||||
return a.nTimeConnected > b.nTimeConnected;
|
return a.m_connected > b.m_connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CompareNetGroupKeyed(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) {
|
static bool CompareNetGroupKeyed(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) {
|
||||||
@ -982,27 +982,27 @@ static bool CompareNetGroupKeyed(const NodeEvictionCandidate &a, const NodeEvict
|
|||||||
static bool CompareNodeBlockTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
|
static bool CompareNodeBlockTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
|
||||||
{
|
{
|
||||||
// There is a fall-through here because it is common for a node to have many peers which have not yet relayed a block.
|
// There is a fall-through here because it is common for a node to have many peers which have not yet relayed a block.
|
||||||
if (a.nLastBlockTime != b.nLastBlockTime) return a.nLastBlockTime < b.nLastBlockTime;
|
if (a.m_last_block_time != b.m_last_block_time) return a.m_last_block_time < b.m_last_block_time;
|
||||||
if (a.fRelevantServices != b.fRelevantServices) return b.fRelevantServices;
|
if (a.fRelevantServices != b.fRelevantServices) return b.fRelevantServices;
|
||||||
return a.nTimeConnected > b.nTimeConnected;
|
return a.m_connected > b.m_connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CompareNodeTXTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
|
static bool CompareNodeTXTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
|
||||||
{
|
{
|
||||||
// There is a fall-through here because it is common for a node to have more than a few peers that have not yet relayed txn.
|
// There is a fall-through here because it is common for a node to have more than a few peers that have not yet relayed txn.
|
||||||
if (a.nLastTXTime != b.nLastTXTime) return a.nLastTXTime < b.nLastTXTime;
|
if (a.m_last_tx_time != b.m_last_tx_time) return a.m_last_tx_time < b.m_last_tx_time;
|
||||||
if (a.m_relay_txs != b.m_relay_txs) return b.m_relay_txs;
|
if (a.m_relay_txs != b.m_relay_txs) return b.m_relay_txs;
|
||||||
if (a.fBloomFilter != b.fBloomFilter) return a.fBloomFilter;
|
if (a.fBloomFilter != b.fBloomFilter) return a.fBloomFilter;
|
||||||
return a.nTimeConnected > b.nTimeConnected;
|
return a.m_connected > b.m_connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pick out the potential block-relay only peers, and sort them by last block time.
|
// Pick out the potential block-relay only peers, and sort them by last block time.
|
||||||
static bool CompareNodeBlockRelayOnlyTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
|
static bool CompareNodeBlockRelayOnlyTime(const NodeEvictionCandidate &a, const NodeEvictionCandidate &b)
|
||||||
{
|
{
|
||||||
if (a.m_relay_txs != b.m_relay_txs) return a.m_relay_txs;
|
if (a.m_relay_txs != b.m_relay_txs) return a.m_relay_txs;
|
||||||
if (a.nLastBlockTime != b.nLastBlockTime) return a.nLastBlockTime < b.nLastBlockTime;
|
if (a.m_last_block_time != b.m_last_block_time) return a.m_last_block_time < b.m_last_block_time;
|
||||||
if (a.fRelevantServices != b.fRelevantServices) return b.fRelevantServices;
|
if (a.fRelevantServices != b.fRelevantServices) return b.fRelevantServices;
|
||||||
return a.nTimeConnected > b.nTimeConnected;
|
return a.m_connected > b.m_connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1021,7 +1021,7 @@ struct CompareNodeNetworkTime {
|
|||||||
{
|
{
|
||||||
if (m_is_local && a.m_is_local != b.m_is_local) return b.m_is_local;
|
if (m_is_local && a.m_is_local != b.m_is_local) return b.m_is_local;
|
||||||
if ((a.m_network == m_network) != (b.m_network == m_network)) return b.m_network == m_network;
|
if ((a.m_network == m_network) != (b.m_network == m_network)) return b.m_network == m_network;
|
||||||
return a.nTimeConnected > b.nTimeConnected;
|
return a.m_connected > b.m_connected;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1148,12 +1148,12 @@ void ProtectEvictionCandidatesByRatio(std::vector<NodeEvictionCandidate>& evicti
|
|||||||
// (vEvictionCandidates is already sorted by reverse connect time)
|
// (vEvictionCandidates is already sorted by reverse connect time)
|
||||||
uint64_t naMostConnections;
|
uint64_t naMostConnections;
|
||||||
unsigned int nMostConnections = 0;
|
unsigned int nMostConnections = 0;
|
||||||
int64_t nMostConnectionsTime = 0;
|
std::chrono::seconds nMostConnectionsTime{0};
|
||||||
std::map<uint64_t, std::vector<NodeEvictionCandidate> > mapNetGroupNodes;
|
std::map<uint64_t, std::vector<NodeEvictionCandidate> > mapNetGroupNodes;
|
||||||
for (const NodeEvictionCandidate &node : vEvictionCandidates) {
|
for (const NodeEvictionCandidate &node : vEvictionCandidates) {
|
||||||
std::vector<NodeEvictionCandidate> &group = mapNetGroupNodes[node.nKeyedNetGroup];
|
std::vector<NodeEvictionCandidate> &group = mapNetGroupNodes[node.nKeyedNetGroup];
|
||||||
group.push_back(node);
|
group.push_back(node);
|
||||||
const int64_t grouptime = group[0].nTimeConnected;
|
const auto grouptime{group[0].m_connected};
|
||||||
|
|
||||||
if (group.size() > nMostConnections || (group.size() == nMostConnections && grouptime > nMostConnectionsTime)) {
|
if (group.size() > nMostConnections || (group.size() == nMostConnections && grouptime > nMostConnectionsTime)) {
|
||||||
nMostConnections = group.size();
|
nMostConnections = group.size();
|
||||||
@ -1196,7 +1196,7 @@ bool CConnman::AttemptToEvictConnection()
|
|||||||
// was accepted. This short time is meant for the VERSION/VERACK exchange and the possible MNAUTH that might
|
// was accepted. This short time is meant for the VERSION/VERACK exchange and the possible MNAUTH that might
|
||||||
// follow when the incoming connection is from another masternode. When a message other than MNAUTH
|
// follow when the incoming connection is from another masternode. When a message other than MNAUTH
|
||||||
// is received after VERSION/VERACK, the protection is lifted immediately.
|
// is received after VERSION/VERACK, the protection is lifted immediately.
|
||||||
bool isProtected = GetTimeSeconds() - node->nTimeConnected < INBOUND_EVICTION_PROTECTION_TIME;
|
bool isProtected = GetTime<std::chrono::seconds>() - node->m_connected < INBOUND_EVICTION_PROTECTION_TIME;
|
||||||
if (node->nTimeFirstMessageReceived != 0 && !node->fFirstMessageIsMNAUTH) {
|
if (node->nTimeFirstMessageReceived != 0 && !node->fFirstMessageIsMNAUTH) {
|
||||||
isProtected = false;
|
isProtected = false;
|
||||||
}
|
}
|
||||||
@ -1210,8 +1210,8 @@ bool CConnman::AttemptToEvictConnection()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeEvictionCandidate candidate = {node->GetId(), node->nTimeConnected, node->m_min_ping_time,
|
NodeEvictionCandidate candidate = {node->GetId(), node->m_connected, node->m_min_ping_time,
|
||||||
node->nLastBlockTime, node->nLastTXTime,
|
node->m_last_block_time, node->m_last_tx_time,
|
||||||
HasAllDesirableServiceFlags(node->nServices),
|
HasAllDesirableServiceFlags(node->nServices),
|
||||||
node->m_relays_txs.load(), node->m_bloom_filter_loaded.load(),
|
node->m_relays_txs.load(), node->m_bloom_filter_loaded.load(),
|
||||||
node->nKeyedNetGroup, node->m_prefer_evict, node->addr.IsLocal(),
|
node->nKeyedNetGroup, node->m_prefer_evict, node->addr.IsLocal(),
|
||||||
@ -1644,7 +1644,7 @@ void CConnman::CalculateNumConnectionsChangedStats()
|
|||||||
|
|
||||||
bool CConnman::ShouldRunInactivityChecks(const CNode& node, std::chrono::seconds now) const
|
bool CConnman::ShouldRunInactivityChecks(const CNode& node, std::chrono::seconds now) const
|
||||||
{
|
{
|
||||||
return std::chrono::seconds{node.nTimeConnected} + m_peer_connect_timeout < now;
|
return node.m_connected + m_peer_connect_timeout < now;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CConnman::InactivityCheck(const CNode& node) const
|
bool CConnman::InactivityCheck(const CNode& node) const
|
||||||
@ -4092,7 +4092,7 @@ unsigned int CConnman::GetReceiveFloodSize() const { return nReceiveFloodSize; }
|
|||||||
|
|
||||||
CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, std::shared_ptr<Sock> sock, const CAddress& addrIn, uint64_t nKeyedNetGroupIn, uint64_t nLocalHostNonceIn, const CAddress& addrBindIn, const std::string& addrNameIn, ConnectionType conn_type_in, bool inbound_onion, std::unique_ptr<i2p::sam::Session>&& i2p_sam_session)
|
CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, std::shared_ptr<Sock> sock, const CAddress& addrIn, uint64_t nKeyedNetGroupIn, uint64_t nLocalHostNonceIn, const CAddress& addrBindIn, const std::string& addrNameIn, ConnectionType conn_type_in, bool inbound_onion, std::unique_ptr<i2p::sam::Session>&& i2p_sam_session)
|
||||||
: m_sock{sock},
|
: m_sock{sock},
|
||||||
nTimeConnected{GetTimeSeconds()},
|
m_connected{GetTime<std::chrono::seconds>()},
|
||||||
addr{addrIn},
|
addr{addrIn},
|
||||||
addrBind{addrBindIn},
|
addrBind{addrBindIn},
|
||||||
m_addr_name{addrNameIn.empty() ? addr.ToStringIPPort() : addrNameIn},
|
m_addr_name{addrNameIn.empty() ? addr.ToStringIPPort() : addrNameIn},
|
||||||
|
28
src/net.h
28
src/net.h
@ -63,8 +63,8 @@ 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 constexpr std::chrono::minutes TIMEOUT_INTERVAL{20};
|
static constexpr std::chrono::minutes TIMEOUT_INTERVAL{20};
|
||||||
/** Time to wait since nTimeConnected before disconnecting a probe node. **/
|
/** Time to wait since m_connected before disconnecting a probe node. */
|
||||||
static const int PROBE_WAIT_INTERVAL = 5;
|
static const auto PROBE_WAIT_INTERVAL{5s};
|
||||||
/** Minimum time between warnings printed to log. */
|
/** Minimum time between warnings printed to log. */
|
||||||
static const int WARNING_INTERVAL = 10 * 60;
|
static const int WARNING_INTERVAL = 10 * 60;
|
||||||
/** Run the feeler connection loop once every 2 minutes. **/
|
/** Run the feeler connection loop once every 2 minutes. **/
|
||||||
@ -82,7 +82,7 @@ static const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS = 8;
|
|||||||
/** Maximum number of addnode outgoing nodes */
|
/** Maximum number of addnode outgoing nodes */
|
||||||
static const int MAX_ADDNODE_CONNECTIONS = 8;
|
static const int MAX_ADDNODE_CONNECTIONS = 8;
|
||||||
/** Eviction protection time for incoming connections */
|
/** Eviction protection time for incoming connections */
|
||||||
static const int INBOUND_EVICTION_PROTECTION_TIME = 1;
|
static const auto INBOUND_EVICTION_PROTECTION_TIME{1s};
|
||||||
/** Maximum number of block-relay-only outgoing connections */
|
/** Maximum number of block-relay-only outgoing connections */
|
||||||
static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS = 2;
|
static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS = 2;
|
||||||
/** Maximum number of feeler connections */
|
/** Maximum number of feeler connections */
|
||||||
@ -276,9 +276,9 @@ public:
|
|||||||
ServiceFlags nServices;
|
ServiceFlags nServices;
|
||||||
std::chrono::seconds m_last_send;
|
std::chrono::seconds m_last_send;
|
||||||
std::chrono::seconds m_last_recv;
|
std::chrono::seconds m_last_recv;
|
||||||
int64_t nLastTXTime;
|
std::chrono::seconds m_last_tx_time;
|
||||||
int64_t nLastBlockTime;
|
std::chrono::seconds m_last_block_time;
|
||||||
int64_t nTimeConnected;
|
std::chrono::seconds m_connected;
|
||||||
int64_t nTimeOffset;
|
int64_t nTimeOffset;
|
||||||
std::string m_addr_name;
|
std::string m_addr_name;
|
||||||
int nVersion;
|
int nVersion;
|
||||||
@ -472,8 +472,8 @@ public:
|
|||||||
|
|
||||||
std::atomic<std::chrono::seconds> m_last_send{0s};
|
std::atomic<std::chrono::seconds> m_last_send{0s};
|
||||||
std::atomic<std::chrono::seconds> m_last_recv{0s};
|
std::atomic<std::chrono::seconds> m_last_recv{0s};
|
||||||
//! Unix epoch time at peer connection, in seconds.
|
//! Unix epoch time at peer connection
|
||||||
const int64_t nTimeConnected;
|
const std::chrono::seconds m_connected;
|
||||||
std::atomic<int64_t> nTimeOffset{0};
|
std::atomic<int64_t> nTimeOffset{0};
|
||||||
std::atomic<int64_t> nLastWarningTime{0};
|
std::atomic<int64_t> nLastWarningTime{0};
|
||||||
std::atomic<int64_t> nTimeFirstMessageReceived{0};
|
std::atomic<int64_t> nTimeFirstMessageReceived{0};
|
||||||
@ -513,7 +513,7 @@ public:
|
|||||||
std::atomic<bool> m_masternode_connection{false};
|
std::atomic<bool> m_masternode_connection{false};
|
||||||
/**
|
/**
|
||||||
* If 'true' this node will be disconnected after MNAUTH (outbound only) or
|
* If 'true' this node will be disconnected after MNAUTH (outbound only) or
|
||||||
* after PROBE_WAIT_INTERVAL seconds since nTimeConnected
|
* after PROBE_WAIT_INTERVAL seconds since m_connected
|
||||||
*/
|
*/
|
||||||
std::atomic<bool> m_masternode_probe_connection{false};
|
std::atomic<bool> m_masternode_probe_connection{false};
|
||||||
// If 'true', we identified it as an intra-quorum relay connection
|
// If 'true', we identified it as an intra-quorum relay connection
|
||||||
@ -615,13 +615,13 @@ public:
|
|||||||
* preliminary validity checks and was saved to disk, even if we don't
|
* preliminary validity checks and was saved to disk, even if we don't
|
||||||
* connect the block or it eventually fails connection. Used as an inbound
|
* connect the block or it eventually fails connection. Used as an inbound
|
||||||
* peer eviction criterium in CConnman::AttemptToEvictConnection. */
|
* peer eviction criterium in CConnman::AttemptToEvictConnection. */
|
||||||
std::atomic<int64_t> nLastBlockTime{0};
|
std::atomic<std::chrono::seconds> m_last_block_time{0s};
|
||||||
|
|
||||||
/** UNIX epoch time of the last transaction received from this peer that we
|
/** UNIX epoch time of the last transaction received from this peer that we
|
||||||
* had not yet seen (e.g. not already received from another peer) and that
|
* had not yet seen (e.g. not already received from another peer) and that
|
||||||
* was accepted into our mempool. Used as an inbound peer eviction criterium
|
* was accepted into our mempool. Used as an inbound peer eviction criterium
|
||||||
* in CConnman::AttemptToEvictConnection. */
|
* in CConnman::AttemptToEvictConnection. */
|
||||||
std::atomic<int64_t> nLastTXTime{0};
|
std::atomic<std::chrono::seconds> m_last_tx_time{0s};
|
||||||
|
|
||||||
/** Last measured round-trip time. Used only for RPC/GUI stats/debugging.*/
|
/** Last measured round-trip time. Used only for RPC/GUI stats/debugging.*/
|
||||||
std::atomic<std::chrono::microseconds> m_last_ping_time{0us};
|
std::atomic<std::chrono::microseconds> m_last_ping_time{0us};
|
||||||
@ -1628,10 +1628,10 @@ extern std::function<void(const CAddress& addr,
|
|||||||
struct NodeEvictionCandidate
|
struct NodeEvictionCandidate
|
||||||
{
|
{
|
||||||
NodeId id;
|
NodeId id;
|
||||||
int64_t nTimeConnected;
|
std::chrono::seconds m_connected;
|
||||||
std::chrono::microseconds m_min_ping_time;
|
std::chrono::microseconds m_min_ping_time;
|
||||||
int64_t nLastBlockTime;
|
std::chrono::seconds m_last_block_time;
|
||||||
int64_t nLastTXTime;
|
std::chrono::seconds m_last_tx_time;
|
||||||
bool fRelevantServices;
|
bool fRelevantServices;
|
||||||
bool m_relay_txs;
|
bool m_relay_txs;
|
||||||
bool fBloomFilter;
|
bool fBloomFilter;
|
||||||
|
@ -105,8 +105,8 @@ static constexpr int64_t CHAIN_SYNC_TIMEOUT = 20 * 60; // 20 minutes
|
|||||||
static constexpr int64_t STALE_CHECK_INTERVAL = 2.5 * 60; // 2.5 minutes (~block interval)
|
static constexpr int64_t STALE_CHECK_INTERVAL = 2.5 * 60; // 2.5 minutes (~block interval)
|
||||||
/** How frequently to check for extra outbound peers and disconnect, in seconds */
|
/** How frequently to check for extra outbound peers and disconnect, in seconds */
|
||||||
static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45;
|
static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45;
|
||||||
/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds */
|
/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict */
|
||||||
static constexpr int64_t MINIMUM_CONNECT_TIME = 30;
|
static constexpr std::chrono::seconds MINIMUM_CONNECT_TIME{30};
|
||||||
/** SHA256("main address relay")[0:8] */
|
/** SHA256("main address relay")[0:8] */
|
||||||
static constexpr uint64_t RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL;
|
static constexpr uint64_t RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL;
|
||||||
/// Age after which a stale block will no longer be served if requested as
|
/// Age after which a stale block will no longer be served if requested as
|
||||||
@ -420,7 +420,7 @@ private:
|
|||||||
void ConsiderEviction(CNode& pto, int64_t time_in_seconds) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
void ConsiderEviction(CNode& pto, int64_t time_in_seconds) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
/** If we have extra outbound peers, try to disconnect the one with the oldest block announcement */
|
/** If we have extra outbound peers, try to disconnect the one with the oldest block announcement */
|
||||||
void EvictExtraOutboundPeers(int64_t time_in_seconds) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
void EvictExtraOutboundPeers(std::chrono::seconds now) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
/** Retrieve unbroadcast transactions from the mempool and reattempt sending to peers */
|
/** Retrieve unbroadcast transactions from the mempool and reattempt sending to peers */
|
||||||
void ReattemptInitialBroadcast(CScheduler& scheduler) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
|
void ReattemptInitialBroadcast(CScheduler& scheduler) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
|
||||||
@ -3240,7 +3240,7 @@ void PeerManagerImpl::ProcessBlock(CNode& pfrom, const std::shared_ptr<const CBl
|
|||||||
bool fNewBlock = false;
|
bool fNewBlock = false;
|
||||||
m_chainman.ProcessNewBlock(m_chainparams, pblock, fForceProcessing, &fNewBlock);
|
m_chainman.ProcessNewBlock(m_chainparams, pblock, fForceProcessing, &fNewBlock);
|
||||||
if (fNewBlock) {
|
if (fNewBlock) {
|
||||||
pfrom.nLastBlockTime = GetTime();
|
pfrom.m_last_block_time = GetTime<std::chrono::seconds>();
|
||||||
} else {
|
} else {
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
mapBlockSource.erase(pblock->GetHash());
|
mapBlockSource.erase(pblock->GetHash());
|
||||||
@ -4136,7 +4136,7 @@ void PeerManagerImpl::ProcessMessage(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pfrom.nLastTXTime = GetTime();
|
pfrom.m_last_tx_time = GetTime<std::chrono::seconds>();
|
||||||
|
|
||||||
LogPrint(BCLog::MEMPOOL, "AcceptToMemoryPool: peer=%d: accepted %s (poolsz %u txn, %u kB)\n",
|
LogPrint(BCLog::MEMPOOL, "AcceptToMemoryPool: peer=%d: accepted %s (poolsz %u txn, %u kB)\n",
|
||||||
pfrom.GetId(),
|
pfrom.GetId(),
|
||||||
@ -5087,7 +5087,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PeerManagerImpl::EvictExtraOutboundPeers(int64_t time_in_seconds)
|
void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
|
||||||
{
|
{
|
||||||
// If we have any extra block-relay-only peers, disconnect the youngest unless
|
// If we have any extra block-relay-only peers, disconnect the youngest unless
|
||||||
// it's given us a block -- in which case, compare with the second-youngest, and
|
// it's given us a block -- in which case, compare with the second-youngest, and
|
||||||
@ -5096,14 +5096,14 @@ void PeerManagerImpl::EvictExtraOutboundPeers(int64_t time_in_seconds)
|
|||||||
// to temporarily in order to sync our tip; see net.cpp.
|
// to temporarily in order to sync our tip; see net.cpp.
|
||||||
// Note that we use higher nodeid as a measure for most recent connection.
|
// Note that we use higher nodeid as a measure for most recent connection.
|
||||||
if (m_connman.GetExtraBlockRelayCount() > 0) {
|
if (m_connman.GetExtraBlockRelayCount() > 0) {
|
||||||
std::pair<NodeId, int64_t> youngest_peer{-1, 0}, next_youngest_peer{-1, 0};
|
std::pair<NodeId, std::chrono::seconds> youngest_peer{-1, 0}, next_youngest_peer{-1, 0};
|
||||||
|
|
||||||
m_connman.ForEachNode([&](CNode* pnode) {
|
m_connman.ForEachNode([&](CNode* pnode) {
|
||||||
if (!pnode->IsBlockOnlyConn() || pnode->fDisconnect) return;
|
if (!pnode->IsBlockOnlyConn() || pnode->fDisconnect) return;
|
||||||
if (pnode->GetId() > youngest_peer.first) {
|
if (pnode->GetId() > youngest_peer.first) {
|
||||||
next_youngest_peer = youngest_peer;
|
next_youngest_peer = youngest_peer;
|
||||||
youngest_peer.first = pnode->GetId();
|
youngest_peer.first = pnode->GetId();
|
||||||
youngest_peer.second = pnode->nLastBlockTime;
|
youngest_peer.second = pnode->m_last_block_time;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
NodeId to_disconnect = youngest_peer.first;
|
NodeId to_disconnect = youngest_peer.first;
|
||||||
@ -5121,13 +5121,14 @@ void PeerManagerImpl::EvictExtraOutboundPeers(int64_t time_in_seconds)
|
|||||||
// valid headers chain with at least as much work as our tip.
|
// valid headers chain with at least as much work as our tip.
|
||||||
CNodeState *node_state = State(pnode->GetId());
|
CNodeState *node_state = State(pnode->GetId());
|
||||||
if (node_state == nullptr ||
|
if (node_state == nullptr ||
|
||||||
(time_in_seconds - pnode->nTimeConnected >= MINIMUM_CONNECT_TIME && node_state->nBlocksInFlight == 0)) {
|
(now - pnode->m_connected >= MINIMUM_CONNECT_TIME && node_state->nBlocksInFlight == 0)) {
|
||||||
pnode->fDisconnect = true;
|
pnode->fDisconnect = true;
|
||||||
LogPrint(BCLog::NET, "disconnecting extra block-relay-only peer=%d (last block received at time %d)\n", pnode->GetId(), pnode->nLastBlockTime);
|
LogPrint(BCLog::NET, "disconnecting extra block-relay-only peer=%d (last block received at time %d)\n",
|
||||||
|
pnode->GetId(), count_seconds(pnode->m_last_block_time));
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
LogPrint(BCLog::NET, "keeping block-relay-only peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
|
LogPrint(BCLog::NET, "keeping block-relay-only peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
|
||||||
pnode->GetId(), pnode->nTimeConnected, node_state->nBlocksInFlight);
|
pnode->GetId(), count_seconds(pnode->m_connected), node_state->nBlocksInFlight);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
@ -5169,12 +5170,13 @@ void PeerManagerImpl::EvictExtraOutboundPeers(int64_t time_in_seconds)
|
|||||||
// Also don't disconnect any peer we're trying to download a
|
// Also don't disconnect any peer we're trying to download a
|
||||||
// block from.
|
// block from.
|
||||||
CNodeState &state = *State(pnode->GetId());
|
CNodeState &state = *State(pnode->GetId());
|
||||||
if (time_in_seconds - pnode->nTimeConnected > MINIMUM_CONNECT_TIME && state.nBlocksInFlight == 0) {
|
if (now - pnode->m_connected > MINIMUM_CONNECT_TIME && state.nBlocksInFlight == 0) {
|
||||||
LogPrint(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);
|
LogPrint(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);
|
||||||
pnode->fDisconnect = true;
|
pnode->fDisconnect = true;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
LogPrint(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n", pnode->GetId(), pnode->nTimeConnected, state.nBlocksInFlight);
|
LogPrint(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
|
||||||
|
pnode->GetId(), count_seconds(pnode->m_connected), state.nBlocksInFlight);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -5196,7 +5198,7 @@ void PeerManagerImpl::CheckForStaleTipAndEvictPeers()
|
|||||||
|
|
||||||
int64_t time_in_seconds = GetTime();
|
int64_t time_in_seconds = GetTime();
|
||||||
|
|
||||||
EvictExtraOutboundPeers(time_in_seconds);
|
EvictExtraOutboundPeers(std::chrono::seconds{time_in_seconds});
|
||||||
|
|
||||||
if (time_in_seconds > m_stale_tip_check_time) {
|
if (time_in_seconds > m_stale_tip_check_time) {
|
||||||
// Check whether our tip is stale, and if so, allow using an extra
|
// Check whether our tip is stale, and if so, allow using an extra
|
||||||
@ -5379,7 +5381,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
|
|
||||||
const auto current_time = GetTime<std::chrono::microseconds>();
|
const auto current_time = GetTime<std::chrono::microseconds>();
|
||||||
|
|
||||||
if (pto->IsAddrFetchConn() && current_time - std::chrono::seconds(pto->nTimeConnected) > 10 * AVG_ADDRESS_BROADCAST_INTERVAL) {
|
if (pto->IsAddrFetchConn() && current_time - pto->m_connected > 10 * AVG_ADDRESS_BROADCAST_INTERVAL) {
|
||||||
LogPrint(BCLog::NET_NETCONN, "addrfetch connection timeout; disconnecting peer=%d\n", pto->GetId());
|
LogPrint(BCLog::NET_NETCONN, "addrfetch connection timeout; disconnecting peer=%d\n", pto->GetId());
|
||||||
pto->fDisconnect = true;
|
pto->fDisconnect = true;
|
||||||
return true;
|
return true;
|
||||||
|
@ -1285,9 +1285,9 @@ void RPCConsole::updateDetailWidget()
|
|||||||
ui->peerHeading->setText(peerAddrDetails);
|
ui->peerHeading->setText(peerAddrDetails);
|
||||||
ui->peerServices->setText(GUIUtil::formatServicesStr(stats->nodeStats.nServices));
|
ui->peerServices->setText(GUIUtil::formatServicesStr(stats->nodeStats.nServices));
|
||||||
const auto time_now{GetTime<std::chrono::seconds>()};
|
const auto time_now{GetTime<std::chrono::seconds>()};
|
||||||
ui->peerConnTime->setText(GUIUtil::formatDurationStr(time_now - std::chrono::seconds{stats->nodeStats.nTimeConnected}));
|
ui->peerConnTime->setText(GUIUtil::formatDurationStr(time_now - stats->nodeStats.m_connected));
|
||||||
ui->peerLastBlock->setText(TimeDurationField(time_now, std::chrono::seconds{stats->nodeStats.nLastBlockTime}));
|
ui->peerLastBlock->setText(TimeDurationField(time_now, stats->nodeStats.m_last_block_time));
|
||||||
ui->peerLastTx->setText(TimeDurationField(time_now, std::chrono::seconds{stats->nodeStats.nLastTXTime}));
|
ui->peerLastTx->setText(TimeDurationField(time_now, stats->nodeStats.m_last_tx_time));
|
||||||
QString bip152_hb_settings;
|
QString bip152_hb_settings;
|
||||||
if (stats->nodeStats.m_bip152_highbandwidth_to) bip152_hb_settings += "To";
|
if (stats->nodeStats.m_bip152_highbandwidth_to) bip152_hb_settings += "To";
|
||||||
if (stats->nodeStats.m_bip152_highbandwidth_from) bip152_hb_settings += (bip152_hb_settings == "" ? "From" : "/From");
|
if (stats->nodeStats.m_bip152_highbandwidth_from) bip152_hb_settings += (bip152_hb_settings == "" ? "From" : "/From");
|
||||||
|
@ -225,11 +225,11 @@ static RPCHelpMan getpeerinfo()
|
|||||||
obj.pushKV("servicesnames", GetServicesNames(stats.nServices));
|
obj.pushKV("servicesnames", GetServicesNames(stats.nServices));
|
||||||
obj.pushKV("lastsend", count_seconds(stats.m_last_send));
|
obj.pushKV("lastsend", count_seconds(stats.m_last_send));
|
||||||
obj.pushKV("lastrecv", count_seconds(stats.m_last_recv));
|
obj.pushKV("lastrecv", count_seconds(stats.m_last_recv));
|
||||||
obj.pushKV("last_transaction", stats.nLastTXTime);
|
obj.pushKV("last_transaction", count_seconds(stats.m_last_tx_time));
|
||||||
obj.pushKV("last_block", stats.nLastBlockTime);
|
obj.pushKV("last_block", count_seconds(stats.m_last_block_time));
|
||||||
obj.pushKV("bytessent", stats.nSendBytes);
|
obj.pushKV("bytessent", stats.nSendBytes);
|
||||||
obj.pushKV("bytesrecv", stats.nRecvBytes);
|
obj.pushKV("bytesrecv", stats.nRecvBytes);
|
||||||
obj.pushKV("conntime", stats.nTimeConnected);
|
obj.pushKV("conntime", count_seconds(stats.m_connected));
|
||||||
obj.pushKV("timeoffset", stats.nTimeOffset);
|
obj.pushKV("timeoffset", stats.nTimeOffset);
|
||||||
if (stats.m_last_ping_time > 0us) {
|
if (stats.m_last_ping_time > 0us) {
|
||||||
obj.pushKV("pingtime", CountSecondsDouble(stats.m_last_ping_time));
|
obj.pushKV("pingtime", CountSecondsDouble(stats.m_last_ping_time));
|
||||||
|
@ -167,6 +167,9 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
|
|||||||
options.m_max_outbound_full_relay = max_outbound_full_relay;
|
options.m_max_outbound_full_relay = max_outbound_full_relay;
|
||||||
options.nMaxFeeler = MAX_FEELER_CONNECTIONS;
|
options.nMaxFeeler = MAX_FEELER_CONNECTIONS;
|
||||||
|
|
||||||
|
const auto time_init{GetTime<std::chrono::seconds>()};
|
||||||
|
SetMockTime(time_init);
|
||||||
|
const auto time_later{time_init + 3 * std::chrono::seconds{chainparams.GetConsensus().nPowTargetSpacing} + 1s};
|
||||||
connman->Init(options);
|
connman->Init(options);
|
||||||
std::vector<CNode *> vNodes;
|
std::vector<CNode *> vNodes;
|
||||||
|
|
||||||
@ -182,7 +185,7 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
|
|||||||
BOOST_CHECK(node->fDisconnect == false);
|
BOOST_CHECK(node->fDisconnect == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetMockTime(GetTime() + 3 * chainparams.GetConsensus().nPowTargetSpacing + 1);
|
SetMockTime(time_later);
|
||||||
|
|
||||||
// Now tip should definitely be stale, and we should look for an extra
|
// Now tip should definitely be stale, and we should look for an extra
|
||||||
// outbound peer
|
// outbound peer
|
||||||
@ -197,7 +200,9 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
|
|||||||
// If we add one more peer, something should get marked for eviction
|
// If we add one more peer, something should get marked for eviction
|
||||||
// on the next check (since we're mocking the time to be in the future, the
|
// on the next check (since we're mocking the time to be in the future, the
|
||||||
// required time connected check should be satisfied).
|
// required time connected check should be satisfied).
|
||||||
|
SetMockTime(time_init);
|
||||||
AddRandomOutboundPeer(vNodes, *peerLogic, *connman, ConnectionType::OUTBOUND_FULL_RELAY);
|
AddRandomOutboundPeer(vNodes, *peerLogic, *connman, ConnectionType::OUTBOUND_FULL_RELAY);
|
||||||
|
SetMockTime(time_later);
|
||||||
|
|
||||||
peerLogic->CheckForStaleTipAndEvictPeers();
|
peerLogic->CheckForStaleTipAndEvictPeers();
|
||||||
for (int i = 0; i < max_outbound_full_relay; ++i) {
|
for (int i = 0; i < max_outbound_full_relay; ++i) {
|
||||||
@ -275,7 +280,7 @@ BOOST_AUTO_TEST_CASE(block_relay_only_eviction)
|
|||||||
// Update the last block time for the extra peer,
|
// Update the last block time for the extra peer,
|
||||||
// and check that the next youngest peer gets evicted.
|
// and check that the next youngest peer gets evicted.
|
||||||
vNodes.back()->fDisconnect = false;
|
vNodes.back()->fDisconnect = false;
|
||||||
vNodes.back()->nLastBlockTime = GetTime();
|
vNodes.back()->m_last_block_time = GetTime<std::chrono::seconds>();
|
||||||
|
|
||||||
peerLogic->CheckForStaleTipAndEvictPeers();
|
peerLogic->CheckForStaleTipAndEvictPeers();
|
||||||
for (int i = 0; i < max_outbound_block_relay - 1; ++i) {
|
for (int i = 0; i < max_outbound_block_relay - 1; ++i) {
|
||||||
|
@ -21,10 +21,10 @@ FUZZ_TARGET(node_eviction)
|
|||||||
while (fuzzed_data_provider.ConsumeBool()) {
|
while (fuzzed_data_provider.ConsumeBool()) {
|
||||||
eviction_candidates.push_back({
|
eviction_candidates.push_back({
|
||||||
/* id */ fuzzed_data_provider.ConsumeIntegral<NodeId>(),
|
/* id */ fuzzed_data_provider.ConsumeIntegral<NodeId>(),
|
||||||
/* nTimeConnected */ fuzzed_data_provider.ConsumeIntegral<int64_t>(),
|
/* m_connected */ std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()},
|
||||||
/* m_min_ping_time */ std::chrono::microseconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()},
|
/* m_min_ping_time */ std::chrono::microseconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()},
|
||||||
/* nLastBlockTime */ fuzzed_data_provider.ConsumeIntegral<int64_t>(),
|
/* m_last_block_time */ std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()},
|
||||||
/* nLastTXTime */ fuzzed_data_provider.ConsumeIntegral<int64_t>(),
|
/* m_last_tx_time */ std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<int64_t>()},
|
||||||
/* fRelevantServices */ fuzzed_data_provider.ConsumeBool(),
|
/* fRelevantServices */ fuzzed_data_provider.ConsumeBool(),
|
||||||
/* m_relay_txs */ fuzzed_data_provider.ConsumeBool(),
|
/* m_relay_txs */ fuzzed_data_provider.ConsumeBool(),
|
||||||
/* fBloomFilter */ fuzzed_data_provider.ConsumeBool(),
|
/* fBloomFilter */ fuzzed_data_provider.ConsumeBool(),
|
||||||
|
@ -64,11 +64,11 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
FastRandomContext random_context{true};
|
FastRandomContext random_context{true};
|
||||||
int num_peers{12};
|
int num_peers{12};
|
||||||
|
|
||||||
// Expect half of the peers with greatest uptime (the lowest nTimeConnected)
|
// Expect half of the peers with greatest uptime (the lowest m_connected)
|
||||||
// to be protected from eviction.
|
// to be protected from eviction.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
c.m_network = NET_IPV4;
|
c.m_network = NET_IPV4;
|
||||||
},
|
},
|
||||||
@ -79,7 +79,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// Verify in the opposite direction.
|
// Verify in the opposite direction.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [num_peers](NodeEvictionCandidate& c) {
|
num_peers, [num_peers](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = num_peers - c.id;
|
c.m_connected = std::chrono::seconds{num_peers - c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
c.m_network = NET_IPV6;
|
c.m_network = NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -101,10 +101,10 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
random_context));
|
random_context));
|
||||||
|
|
||||||
// Expect 1/4 onion peers and 1/4 of the other peers to be protected,
|
// Expect 1/4 onion peers and 1/4 of the other peers to be protected,
|
||||||
// sorted by longest uptime (lowest nTimeConnected), if no localhost, I2P or CJDNS peers.
|
// sorted by longest uptime (lowest m_connected), if no localhost, I2P or CJDNS peers.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
c.m_network = (c.id == 3 || c.id > 7) ? NET_ONION : NET_IPV6;
|
c.m_network = (c.id == 3 || c.id > 7) ? NET_ONION : NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -124,10 +124,10 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
random_context));
|
random_context));
|
||||||
|
|
||||||
// Expect 1/4 localhost peers and 1/4 of the other peers to be protected,
|
// Expect 1/4 localhost peers and 1/4 of the other peers to be protected,
|
||||||
// sorted by longest uptime (lowest nTimeConnected), if no onion, I2P, or CJDNS peers.
|
// sorted by longest uptime (lowest m_connected), if no onion, I2P, or CJDNS peers.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id > 6);
|
c.m_is_local = (c.id > 6);
|
||||||
c.m_network = NET_IPV6;
|
c.m_network = NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -147,10 +147,10 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
random_context));
|
random_context));
|
||||||
|
|
||||||
// Expect 1/4 I2P peers and 1/4 of the other peers to be protected, sorted
|
// Expect 1/4 I2P peers and 1/4 of the other peers to be protected, sorted
|
||||||
// by longest uptime (lowest nTimeConnected), if no onion, localhost, or CJDNS peers.
|
// by longest uptime (lowest m_connected), if no onion, localhost, or CJDNS peers.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
c.m_network = (c.id == 4 || c.id > 8) ? NET_I2P : NET_IPV6;
|
c.m_network = (c.id == 4 || c.id > 8) ? NET_I2P : NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -170,10 +170,10 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
random_context));
|
random_context));
|
||||||
|
|
||||||
// Expect 1/4 CJDNS peers and 1/4 of the other peers to be protected, sorted
|
// Expect 1/4 CJDNS peers and 1/4 of the other peers to be protected, sorted
|
||||||
// by longest uptime (lowest nTimeConnected), if no onion, localhost, or I2P peers.
|
// by longest uptime (lowest m_connected), if no onion, localhost, or I2P peers.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
c.m_network = (c.id == 4 || c.id > 8) ? NET_CJDNS : NET_IPV6;
|
c.m_network = (c.id == 4 || c.id > 8) ? NET_CJDNS : NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// stable sort breaks tie with array order of localhost first.
|
// stable sort breaks tie with array order of localhost first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
4, [](NodeEvictionCandidate& c) {
|
4, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 4);
|
c.m_is_local = (c.id == 4);
|
||||||
c.m_network = (c.id == 3) ? NET_ONION : NET_IPV4;
|
c.m_network = (c.id == 3) ? NET_ONION : NET_IPV4;
|
||||||
},
|
},
|
||||||
@ -201,7 +201,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// uptime; stable sort breaks tie with array order of localhost first.
|
// uptime; stable sort breaks tie with array order of localhost first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
7, [](NodeEvictionCandidate& c) {
|
7, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 6);
|
c.m_is_local = (c.id == 6);
|
||||||
c.m_network = (c.id == 5) ? NET_ONION : NET_IPV4;
|
c.m_network = (c.id == 5) ? NET_ONION : NET_IPV4;
|
||||||
},
|
},
|
||||||
@ -214,7 +214,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// by uptime; stable sort breaks tie with array order of localhost first.
|
// by uptime; stable sort breaks tie with array order of localhost first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
8, [](NodeEvictionCandidate& c) {
|
8, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 6);
|
c.m_is_local = (c.id == 6);
|
||||||
c.m_network = (c.id == 5) ? NET_ONION : NET_IPV4;
|
c.m_network = (c.id == 5) ? NET_ONION : NET_IPV4;
|
||||||
},
|
},
|
||||||
@ -227,7 +227,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// uptime; stable sort breaks ties with the array order of localhost first.
|
// uptime; stable sort breaks ties with the array order of localhost first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 6 || c.id == 9 || c.id == 11);
|
c.m_is_local = (c.id == 6 || c.id == 9 || c.id == 11);
|
||||||
c.m_network = (c.id == 7 || c.id == 8 || c.id == 10) ? NET_ONION : NET_IPV6;
|
c.m_network = (c.id == 7 || c.id == 8 || c.id == 10) ? NET_ONION : NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -239,7 +239,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// protect 2 localhost and 1 onion, plus 3 other peers, sorted by longest uptime.
|
// protect 2 localhost and 1 onion, plus 3 other peers, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id > 4 && c.id < 9);
|
c.m_is_local = (c.id > 4 && c.id < 9);
|
||||||
c.m_network = (c.id == 10) ? NET_ONION : NET_IPV4;
|
c.m_network = (c.id == 10) ? NET_ONION : NET_IPV4;
|
||||||
},
|
},
|
||||||
@ -251,7 +251,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// protect 2 localhost and 2 onions, plus 4 other peers, sorted by longest uptime.
|
// protect 2 localhost and 2 onions, plus 4 other peers, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
16, [](NodeEvictionCandidate& c) {
|
16, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 6 || c.id == 9 || c.id == 11 || c.id == 12);
|
c.m_is_local = (c.id == 6 || c.id == 9 || c.id == 11 || c.id == 12);
|
||||||
c.m_network = (c.id == 8 || c.id == 10) ? NET_ONION : NET_IPV6;
|
c.m_network = (c.id == 8 || c.id == 10) ? NET_ONION : NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -264,7 +264,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// others, sorted by longest uptime.
|
// others, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
16, [](NodeEvictionCandidate& c) {
|
16, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id > 10);
|
c.m_is_local = (c.id > 10);
|
||||||
c.m_network = (c.id == 10) ? NET_ONION : NET_IPV4;
|
c.m_network = (c.id == 10) ? NET_ONION : NET_IPV4;
|
||||||
},
|
},
|
||||||
@ -277,7 +277,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// plus 4 others, sorted by longest uptime.
|
// plus 4 others, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
16, [](NodeEvictionCandidate& c) {
|
16, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 15);
|
c.m_is_local = (c.id == 15);
|
||||||
c.m_network = (c.id > 6 && c.id < 11) ? NET_ONION : NET_IPV6;
|
c.m_network = (c.id > 6 && c.id < 11) ? NET_ONION : NET_IPV6;
|
||||||
},
|
},
|
||||||
@ -290,7 +290,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// others, sorted by longest uptime.
|
// others, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
num_peers, [](NodeEvictionCandidate& c) {
|
num_peers, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = false;
|
c.m_is_local = false;
|
||||||
if (c.id == 8 || c.id == 10) {
|
if (c.id == 8 || c.id == 10) {
|
||||||
c.m_network = NET_ONION;
|
c.m_network = NET_ONION;
|
||||||
@ -311,7 +311,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// by longest uptime; stable sort breaks tie with array order of I2P first.
|
// by longest uptime; stable sort breaks tie with array order of I2P first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
4, [](NodeEvictionCandidate& c) {
|
4, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 2);
|
c.m_is_local = (c.id == 2);
|
||||||
if (c.id == 3) {
|
if (c.id == 3) {
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -330,7 +330,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// by longest uptime; stable sort breaks tie with array order of I2P first.
|
// by longest uptime; stable sort breaks tie with array order of I2P first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
7, [](NodeEvictionCandidate& c) {
|
7, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 4);
|
c.m_is_local = (c.id == 4);
|
||||||
if (c.id == 6) {
|
if (c.id == 6) {
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -349,7 +349,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// by uptime; stable sort breaks tie with array order of I2P then localhost.
|
// by uptime; stable sort breaks tie with array order of I2P then localhost.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
8, [](NodeEvictionCandidate& c) {
|
8, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 6);
|
c.m_is_local = (c.id == 6);
|
||||||
if (c.id == 5) {
|
if (c.id == 5) {
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -368,7 +368,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// for 8 total, sorted by longest uptime.
|
// for 8 total, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
16, [](NodeEvictionCandidate& c) {
|
16, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 6 || c.id > 11);
|
c.m_is_local = (c.id == 6 || c.id > 11);
|
||||||
if (c.id == 7 || c.id == 11) {
|
if (c.id == 7 || c.id == 11) {
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -387,7 +387,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// sorted by longest uptime.
|
// sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
24, [](NodeEvictionCandidate& c) {
|
24, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 12);
|
c.m_is_local = (c.id == 12);
|
||||||
if (c.id > 14 && c.id < 23) { // 4 protected instead of usual 2
|
if (c.id > 14 && c.id < 23) { // 4 protected instead of usual 2
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -406,7 +406,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// unused localhost slot), plus 6 others for 12/24 total, sorted by longest uptime.
|
// unused localhost slot), plus 6 others for 12/24 total, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
24, [](NodeEvictionCandidate& c) {
|
24, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 15);
|
c.m_is_local = (c.id == 15);
|
||||||
if (c.id == 12 || c.id == 14 || c.id == 17) {
|
if (c.id == 12 || c.id == 14 || c.id == 17) {
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -425,7 +425,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// for 12/24 total, sorted by longest uptime.
|
// for 12/24 total, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
24, [](NodeEvictionCandidate& c) {
|
24, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 13);
|
c.m_is_local = (c.id == 13);
|
||||||
if (c.id > 16) {
|
if (c.id > 16) {
|
||||||
c.m_network = NET_I2P;
|
c.m_network = NET_I2P;
|
||||||
@ -444,7 +444,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// sorted by longest uptime.
|
// sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
24, [](NodeEvictionCandidate& c) {
|
24, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id > 15);
|
c.m_is_local = (c.id > 15);
|
||||||
if (c.id > 10 && c.id < 15) {
|
if (c.id > 10 && c.id < 15) {
|
||||||
c.m_network = NET_CJDNS;
|
c.m_network = NET_CJDNS;
|
||||||
@ -466,7 +466,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// order of CJDNS first.
|
// order of CJDNS first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
5, [](NodeEvictionCandidate& c) {
|
5, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 3);
|
c.m_is_local = (c.id == 3);
|
||||||
if (c.id == 4) {
|
if (c.id == 4) {
|
||||||
c.m_network = NET_CJDNS;
|
c.m_network = NET_CJDNS;
|
||||||
@ -488,7 +488,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// array order of CJDNS first.
|
// array order of CJDNS first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
7, [](NodeEvictionCandidate& c) {
|
7, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 4);
|
c.m_is_local = (c.id == 4);
|
||||||
if (c.id == 6) {
|
if (c.id == 6) {
|
||||||
c.m_network = NET_CJDNS;
|
c.m_network = NET_CJDNS;
|
||||||
@ -510,7 +510,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// array order of CJDNS first.
|
// array order of CJDNS first.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
8, [](NodeEvictionCandidate& c) {
|
8, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 3);
|
c.m_is_local = (c.id == 3);
|
||||||
if (c.id == 5) {
|
if (c.id == 5) {
|
||||||
c.m_network = NET_CJDNS;
|
c.m_network = NET_CJDNS;
|
||||||
@ -531,7 +531,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// total), plus 4 others for 8 total, sorted by longest uptime.
|
// total), plus 4 others for 8 total, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
16, [](NodeEvictionCandidate& c) {
|
16, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id > 5);
|
c.m_is_local = (c.id > 5);
|
||||||
if (c.id == 11 || c.id == 15) {
|
if (c.id == 11 || c.id == 15) {
|
||||||
c.m_network = NET_CJDNS;
|
c.m_network = NET_CJDNS;
|
||||||
@ -552,7 +552,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
|||||||
// total), plus 6 others for 12/24 total, sorted by longest uptime.
|
// total), plus 6 others for 12/24 total, sorted by longest uptime.
|
||||||
BOOST_CHECK(IsProtected(
|
BOOST_CHECK(IsProtected(
|
||||||
24, [](NodeEvictionCandidate& c) {
|
24, [](NodeEvictionCandidate& c) {
|
||||||
c.nTimeConnected = c.id;
|
c.m_connected = std::chrono::seconds{c.id};
|
||||||
c.m_is_local = (c.id == 13);
|
c.m_is_local = (c.id == 13);
|
||||||
if (c.id > 17) {
|
if (c.id > 17) {
|
||||||
c.m_network = NET_CJDNS;
|
c.m_network = NET_CJDNS;
|
||||||
@ -617,7 +617,7 @@ BOOST_AUTO_TEST_CASE(peer_eviction_test)
|
|||||||
// into our mempool should be protected from eviction.
|
// into our mempool should be protected from eviction.
|
||||||
BOOST_CHECK(!IsEvicted(
|
BOOST_CHECK(!IsEvicted(
|
||||||
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
||||||
candidate.nLastTXTime = number_of_nodes - candidate.id;
|
candidate.m_last_tx_time = std::chrono::seconds{number_of_nodes - candidate.id};
|
||||||
},
|
},
|
||||||
{0, 1, 2, 3}, random_context));
|
{0, 1, 2, 3}, random_context));
|
||||||
|
|
||||||
@ -625,7 +625,7 @@ BOOST_AUTO_TEST_CASE(peer_eviction_test)
|
|||||||
// blocks should be protected from eviction.
|
// blocks should be protected from eviction.
|
||||||
BOOST_CHECK(!IsEvicted(
|
BOOST_CHECK(!IsEvicted(
|
||||||
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
||||||
candidate.nLastBlockTime = number_of_nodes - candidate.id;
|
candidate.m_last_block_time = std::chrono::seconds{number_of_nodes - candidate.id};
|
||||||
if (candidate.id <= 7) {
|
if (candidate.id <= 7) {
|
||||||
candidate.m_relay_txs = false;
|
candidate.m_relay_txs = false;
|
||||||
candidate.fRelevantServices = true;
|
candidate.fRelevantServices = true;
|
||||||
@ -637,14 +637,14 @@ BOOST_AUTO_TEST_CASE(peer_eviction_test)
|
|||||||
// protected from eviction.
|
// protected from eviction.
|
||||||
BOOST_CHECK(!IsEvicted(
|
BOOST_CHECK(!IsEvicted(
|
||||||
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
||||||
candidate.nLastBlockTime = number_of_nodes - candidate.id;
|
candidate.m_last_block_time = std::chrono::seconds{number_of_nodes - candidate.id};
|
||||||
},
|
},
|
||||||
{0, 1, 2, 3}, random_context));
|
{0, 1, 2, 3}, random_context));
|
||||||
|
|
||||||
// Combination of the previous two tests.
|
// Combination of the previous two tests.
|
||||||
BOOST_CHECK(!IsEvicted(
|
BOOST_CHECK(!IsEvicted(
|
||||||
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
||||||
candidate.nLastBlockTime = number_of_nodes - candidate.id;
|
candidate.m_last_block_time = std::chrono::seconds{number_of_nodes - candidate.id};
|
||||||
if (candidate.id <= 7) {
|
if (candidate.id <= 7) {
|
||||||
candidate.m_relay_txs = false;
|
candidate.m_relay_txs = false;
|
||||||
candidate.fRelevantServices = true;
|
candidate.fRelevantServices = true;
|
||||||
@ -657,8 +657,8 @@ BOOST_AUTO_TEST_CASE(peer_eviction_test)
|
|||||||
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
number_of_nodes, [number_of_nodes](NodeEvictionCandidate& candidate) {
|
||||||
candidate.nKeyedNetGroup = number_of_nodes - candidate.id; // 4 protected
|
candidate.nKeyedNetGroup = number_of_nodes - candidate.id; // 4 protected
|
||||||
candidate.m_min_ping_time = std::chrono::microseconds{candidate.id}; // 8 protected
|
candidate.m_min_ping_time = std::chrono::microseconds{candidate.id}; // 8 protected
|
||||||
candidate.nLastTXTime = number_of_nodes - candidate.id; // 4 protected
|
candidate.m_last_tx_time = std::chrono::seconds{number_of_nodes - candidate.id}; // 4 protected
|
||||||
candidate.nLastBlockTime = number_of_nodes - candidate.id; // 4 protected
|
candidate.m_last_block_time = std::chrono::seconds{number_of_nodes - candidate.id}; // 4 protected
|
||||||
},
|
},
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, random_context));
|
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, random_context));
|
||||||
|
|
||||||
|
@ -47,10 +47,10 @@ std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(int n_candida
|
|||||||
for (int id = 0; id < n_candidates; ++id) {
|
for (int id = 0; id < n_candidates; ++id) {
|
||||||
candidates.push_back({
|
candidates.push_back({
|
||||||
/* id */ id,
|
/* id */ id,
|
||||||
/* nTimeConnected */ static_cast<int64_t>(random_context.randrange(100)),
|
/* m_connected */ std::chrono::seconds{random_context.randrange(100)},
|
||||||
/* m_min_ping_time */ std::chrono::microseconds{random_context.randrange(100)},
|
/* m_min_ping_time */ std::chrono::microseconds{random_context.randrange(100)},
|
||||||
/* nLastBlockTime */ static_cast<int64_t>(random_context.randrange(100)),
|
/* m_last_block_time */ std::chrono::seconds{random_context.randrange(100)},
|
||||||
/* nLastTXTime */ static_cast<int64_t>(random_context.randrange(100)),
|
/* m_last_tx_time */ std::chrono::seconds{random_context.randrange(100)},
|
||||||
/* fRelevantServices */ random_context.randbool(),
|
/* fRelevantServices */ random_context.randbool(),
|
||||||
/* m_relay_txs */ random_context.randbool(),
|
/* m_relay_txs */ random_context.randbool(),
|
||||||
/* fBloomFilter */ random_context.randbool(),
|
/* fBloomFilter */ random_context.randbool(),
|
||||||
|
Loading…
Reference in New Issue
Block a user