mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
select newest introducers to publish
This commit is contained in:
parent
6a590bf970
commit
4178ac8eac
@ -1056,30 +1056,32 @@ namespace transport
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<std::shared_ptr<SSU2Session> > SSU2Server::FindIntroducers (int maxNumIntroducers,
|
std::vector<std::shared_ptr<SSU2Session> > SSU2Server::FindIntroducers (int maxNumIntroducers,
|
||||||
bool v4, const std::unordered_set<i2p::data::IdentHash>& excluded)
|
bool v4, const std::unordered_set<i2p::data::IdentHash>& excluded) const
|
||||||
{
|
{
|
||||||
std::list<std::shared_ptr<SSU2Session> > ret;
|
std::vector<std::shared_ptr<SSU2Session> > ret;
|
||||||
|
if (maxNumIntroducers <= 0) return ret;
|
||||||
|
auto newer = [](const std::shared_ptr<SSU2Session>& s1, const std::shared_ptr<SSU2Session>& s2) -> bool
|
||||||
|
{
|
||||||
|
auto t1 = s1->GetCreationTime (), t2 = s2->GetCreationTime ();
|
||||||
|
return (t1 != t2) ? (t1 > t2) : (s1->GetConnID () > s2->GetConnID ());
|
||||||
|
};
|
||||||
|
std::set<std::shared_ptr<SSU2Session>, decltype (newer)> introducers(newer);
|
||||||
for (const auto& s : m_Sessions)
|
for (const auto& s : m_Sessions)
|
||||||
{
|
{
|
||||||
if (s.second->IsEstablished () && (s.second->GetRelayTag () && s.second->IsOutgoing ()) &&
|
if (s.second->IsEstablished () && (s.second->GetRelayTag () && s.second->IsOutgoing ()) &&
|
||||||
!excluded.count (s.second->GetRemoteIdentity ()->GetIdentHash ()) &&
|
!excluded.count (s.second->GetRemoteIdentity ()->GetIdentHash ()) &&
|
||||||
((v4 && (s.second->GetRemoteTransports () & i2p::data::RouterInfo::eSSU2V4)) ||
|
((v4 && (s.second->GetRemoteTransports () & i2p::data::RouterInfo::eSSU2V4)) ||
|
||||||
(!v4 && (s.second->GetRemoteTransports () & i2p::data::RouterInfo::eSSU2V6))))
|
(!v4 && (s.second->GetRemoteTransports () & i2p::data::RouterInfo::eSSU2V6))))
|
||||||
ret.push_back (s.second);
|
introducers.insert (s.second);
|
||||||
}
|
}
|
||||||
if ((int)ret.size () > maxNumIntroducers)
|
int i = 0;
|
||||||
|
for (auto it: introducers)
|
||||||
{
|
{
|
||||||
// shink ret randomly
|
ret.push_back (it);
|
||||||
int sz = ret.size () - maxNumIntroducers;
|
i++;
|
||||||
for (int i = 0; i < sz; i++)
|
if (i >= maxNumIntroducers) break;
|
||||||
{
|
}
|
||||||
auto ind = m_Rng () % ret.size ();
|
|
||||||
auto it = ret.begin ();
|
|
||||||
std::advance (it, ind);
|
|
||||||
ret.erase (it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
#include <vector>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@ -129,8 +130,8 @@ namespace transport
|
|||||||
void HandleResendTimer (const boost::system::error_code& ecode);
|
void HandleResendTimer (const boost::system::error_code& ecode);
|
||||||
|
|
||||||
void ConnectThroughIntroducer (std::shared_ptr<SSU2Session> session);
|
void ConnectThroughIntroducer (std::shared_ptr<SSU2Session> session);
|
||||||
std::list<std::shared_ptr<SSU2Session> > FindIntroducers (int maxNumIntroducers,
|
std::vector<std::shared_ptr<SSU2Session> > FindIntroducers (int maxNumIntroducers,
|
||||||
bool v4, const std::unordered_set<i2p::data::IdentHash>& excluded);
|
bool v4, const std::unordered_set<i2p::data::IdentHash>& excluded) const;
|
||||||
void UpdateIntroducers (bool v4);
|
void UpdateIntroducers (bool v4);
|
||||||
void ScheduleIntroducersUpdateTimer ();
|
void ScheduleIntroducersUpdateTimer ();
|
||||||
void HandleIntroducersUpdateTimer (const boost::system::error_code& ecode, bool v4);
|
void HandleIntroducersUpdateTimer (const boost::system::error_code& ecode, bool v4);
|
||||||
|
Loading…
Reference in New Issue
Block a user