Browse Source

more precise router selection

pull/1677/head
orignal 3 years ago
parent
commit
a6937c792f
  1. 36
      libi2pd/NetDb.cpp

36
libi2pd/NetDb.cpp

@ -1223,24 +1223,34 @@ namespace data
{ {
if (m_RouterInfos.empty()) if (m_RouterInfos.empty())
return 0; return 0;
uint32_t ind = rand () % m_RouterInfos.size ();
for (int j = 0; j < 2; j++)
{
uint32_t i = 0;
std::unique_lock<std::mutex> l(m_RouterInfosMutex); std::unique_lock<std::mutex> l(m_RouterInfosMutex);
for (const auto& it: m_RouterInfos) auto ind = rand () % m_RouterInfos.size ();
{ auto it = m_RouterInfos.begin ();
if (i >= ind) std::advance (it, ind);
// try random router
if (it != m_RouterInfos.end () && !it->second->IsUnreachable () && filter (it->second))
return it->second;
// try closest routers
auto it1 = it; it1++;
// forward
while (it1 != m_RouterInfos.end ())
{ {
if (!it.second->IsUnreachable () && filter (it.second)) if (!it1->second->IsUnreachable () && filter (it1->second))
return it.second; return it1->second;
it1++;
} }
else // still not found, try from the beginning
i++; if (ind)
{
it1 = m_RouterInfos.begin ();
while (it1 != it || it1 != m_RouterInfos.end ())
{
if (!it1->second->IsUnreachable () && filter (it1->second))
return it1->second;
it1++;
} }
// we couldn't find anything, try second pass
ind = 0;
} }
return nullptr; // seems we have too few routers return nullptr; // seems we have too few routers
} }

Loading…
Cancel
Save