diff --git a/NetDb.cpp b/NetDb.cpp index b8eb14ba..f07d17ba 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -912,7 +912,8 @@ namespace data { if (i >= ind) { - if (!it.second->IsUnreachable () && filter (it.second)) + if (!it.second->IsUnreachable () && filter (it.second) && + (j || !it.second->GetProfile ()->IsBad ())) return it.second; } else diff --git a/Profiling.cpp b/Profiling.cpp index 027635ae..bac162e0 100644 --- a/Profiling.cpp +++ b/Profiling.cpp @@ -128,17 +128,27 @@ namespace data UpdateTime (); } - bool RouterProfile::IsLowPartcipationRate () const + bool RouterProfile::IsLowPartcipationRate (int elapsedTime) const { - if ((GetTime () - m_LastUpdateTime).total_seconds () < 900) // if less than 15 minutes + if (elapsedTime < 900) // if less than 15 minutes return m_NumTunnelsAgreed < m_NumTunnelsDeclined; // 50% rate else return 3*m_NumTunnelsAgreed < m_NumTunnelsDeclined; // 25% rate } + + bool RouterProfile::IsLowReplyRate (int elapsedTime) const + { + auto total = m_NumTunnelsAgreed + m_NumTunnelsDeclined; + if (elapsedTime < 300) // if less than 5 minutes + return m_NumTunnelsNonReplied > 10*total; + else + return !total && m_NumTunnelsNonReplied > 20; + } bool RouterProfile::IsBad () const { - return IsAlwaysDeclining () || IsNonResponding () || IsLowPartcipationRate (); + auto elapsedTime = (GetTime () - m_LastUpdateTime).total_seconds (); + return IsAlwaysDeclining () || IsLowPartcipationRate (elapsedTime) || IsLowReplyRate (elapsedTime); } std::shared_ptr GetRouterProfile (const IdentHash& identHash) diff --git a/Profiling.h b/Profiling.h index d16f8954..93fb5be2 100644 --- a/Profiling.h +++ b/Profiling.h @@ -42,8 +42,8 @@ namespace data void UpdateTime (); bool IsAlwaysDeclining () const { return !m_NumTunnelsAgreed && m_NumTunnelsDeclined >= 5; }; - bool IsNonResponding () const { return m_NumTunnelsNonReplied > 20 && !(m_NumTunnelsAgreed + m_NumTunnelsDeclined); }; - bool IsLowPartcipationRate () const; + bool IsLowPartcipationRate (int elapsedTime) const; + bool IsLowReplyRate (int elapsedTime) const; private: diff --git a/TunnelPool.cpp b/TunnelPool.cpp index 15606959..e412d09c 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -263,11 +263,6 @@ namespace tunnel bool isExploratory = (m_LocalDestination == &i2p::context); // TODO: implement it better auto hop = isExploratory ? i2p::data::netdb.GetRandomRouter (prevHop): i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop); - if (!isExploratory && hop && hop->GetProfile ()->IsBad ()) - { - LogPrint (eLogInfo, "Selected peer for tunnel has bad profile. Selecting another"); - hop = i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop); - } if (!hop) hop = i2p::data::netdb.GetRandomRouter ();