From 3720a5fce32fb1eae138eff2d83e1a2f5d0b57f1 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 19 Aug 2024 15:51:56 -0400 Subject: [PATCH] don't select same peer too often --- libi2pd/Transports.cpp | 13 ++++++++++--- libi2pd/Transports.h | 5 +++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index de0e5b5b..e4884d6b 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -977,6 +977,7 @@ namespace transport std::shared_ptr Transports::GetRandomPeer (Filter filter) const { if (m_Peers.empty()) return nullptr; + auto ts = i2p::util::GetSecondsSinceEpoch (); bool found = false; i2p::data::IdentHash ident; { @@ -1017,9 +1018,11 @@ namespace transport it = it1; while (it != it2 && it != m_Peers.end ()) { - if (filter (it->second)) + if (ts > it->second->lastSelectionTime + PEER_SELECTION_MIN_INTERVAL && + filter (it->second)) { ident = it->first; + it->second->lastSelectionTime = ts; found = true; break; } @@ -1031,9 +1034,11 @@ namespace transport it = m_Peers.begin (); while (it != it1 && it != m_Peers.end ()) { - if (filter (it->second)) + if (ts > it->second->lastSelectionTime + PEER_SELECTION_MIN_INTERVAL && + filter (it->second)) { ident = it->first; + it->second->lastSelectionTime = ts; found = true; break; } @@ -1045,9 +1050,11 @@ namespace transport it = it2; while (it != m_Peers.end ()) { - if (filter (it->second)) + if (ts > it->second->lastSelectionTime + PEER_SELECTION_MIN_INTERVAL && + filter (it->second)) { ident = it->first; + it->second->lastSelectionTime = ts; found = true; break; } diff --git a/libi2pd/Transports.h b/libi2pd/Transports.h index e4526cd5..70273094 100644 --- a/libi2pd/Transports.h +++ b/libi2pd/Transports.h @@ -64,12 +64,13 @@ namespace transport const int PEER_ROUTER_INFO_UPDATE_INTERVAL = 31*60; // in seconds const int PEER_ROUTER_INFO_UPDATE_INTERVAL_VARIANCE = 7*60; // in seconds const size_t PEER_ROUTER_INFO_OVERLOAD_QUEUE_SIZE = 25; + const int PEER_SELECTION_MIN_INTERVAL = 20; // in seconds struct Peer { int numAttempts; std::shared_ptr router; std::list > sessions; - uint64_t creationTime, nextRouterInfoUpdateTime; + uint64_t creationTime, nextRouterInfoUpdateTime, lastSelectionTime; std::vector > delayedMessages; std::vector priority; bool isHighBandwidth, isEligible; @@ -77,7 +78,7 @@ namespace transport Peer (std::shared_ptr r, uint64_t ts): numAttempts (0), router (r), creationTime (ts), nextRouterInfoUpdateTime (ts + PEER_ROUTER_INFO_UPDATE_INTERVAL), - isHighBandwidth (false), isEligible (false) + lastSelectionTime (0), isHighBandwidth (false), isEligible (false) { UpdateParams (router); }