mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-04-27 11:17:49 +02:00
Add NetDb::VisitRandomRouterInfos
This commit is contained in:
parent
fa8548fe34
commit
970557660e
2 changed files with 49 additions and 13 deletions
54
NetDb.cpp
54
NetDb.cpp
|
@ -68,19 +68,9 @@ namespace data
|
|||
m_Requests.Stop ();
|
||||
}
|
||||
}
|
||||
|
||||
void NetDb::WaitForReady()
|
||||
{
|
||||
m_Ready.get_future().wait();
|
||||
}
|
||||
|
||||
void NetDb::Run ()
|
||||
{
|
||||
try {
|
||||
m_Ready.set_value();
|
||||
} catch( std::future_error & ex) {
|
||||
(void) ex;
|
||||
}
|
||||
uint32_t lastSave = 0, lastPublish = 0, lastExploratory = 0, lastManageRequest = 0, lastDestinationCleanup = 0;
|
||||
while (m_IsRunning)
|
||||
{
|
||||
|
@ -354,6 +344,50 @@ namespace data
|
|||
for ( const auto & item : m_RouterInfos )
|
||||
v(*item.second);
|
||||
}
|
||||
|
||||
size_t NetDb::VisitRandomRouterInfos(RouterInfoFilter filter, RouterInfoVisitor v, size_t n)
|
||||
{
|
||||
std::vector<std::shared_ptr<const RouterInfo> > found;
|
||||
const size_t max_iters_per_cyle = 3;
|
||||
size_t iters = max_iters_per_cyle;
|
||||
while(n)
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(m_RouterInfosMutex);
|
||||
uint32_t idx = rand () % m_RouterInfos.size ();
|
||||
uint32_t i = 0;
|
||||
for (const auto & it : m_RouterInfos) {
|
||||
if(i >= idx) // are we at the random start point?
|
||||
{
|
||||
// yes, check if we want this one
|
||||
if(filter(*it.second))
|
||||
{
|
||||
// we have a match
|
||||
--n;
|
||||
found.push_back(it.second);
|
||||
// reset max iterations per cycle
|
||||
iters = max_iters_per_cyle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else // not there yet
|
||||
++i;
|
||||
}
|
||||
--iters;
|
||||
// have we tried enough this cycle ?
|
||||
if(!iters) {
|
||||
// yes let's try the next cycle
|
||||
--n;
|
||||
iters = max_iters_per_cyle;
|
||||
}
|
||||
}
|
||||
// visit the ones we found
|
||||
size_t visited = 0;
|
||||
for(const auto & ri : found ) {
|
||||
v(*ri);
|
||||
++visited;
|
||||
}
|
||||
return visited;
|
||||
}
|
||||
|
||||
void NetDb::Load ()
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue