Browse Source

more precise router selection

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

42
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 (); std::unique_lock<std::mutex> l(m_RouterInfosMutex);
for (int j = 0; j < 2; j++) auto ind = rand () % m_RouterInfos.size ();
auto it = m_RouterInfos.begin ();
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 ())
{ {
uint32_t i = 0; if (!it1->second->IsUnreachable () && filter (it1->second))
std::unique_lock<std::mutex> l(m_RouterInfosMutex); return it1->second;
for (const auto& it: m_RouterInfos) it1++;
}
// still not found, try from the beginning
if (ind)
{
it1 = m_RouterInfos.begin ();
while (it1 != it || it1 != m_RouterInfos.end ())
{ {
if (i >= ind) if (!it1->second->IsUnreachable () && filter (it1->second))
{ return it1->second;
if (!it.second->IsUnreachable () && filter (it.second)) it1++;
return it.second; }
} }
else
i++;
}
// 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