try fixing bootstrap

pull/707/head
Jeff Becker 5 years ago
parent 0a7021d827
commit 16e20a9e79
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -61,7 +61,8 @@ namespace llarp
auto threads = config->router.workerThreads(); auto threads = config->router.workerThreads();
if(threads <= 0) if(threads <= 0)
threads = 1; threads = 1;
worker = std::make_shared< llarp::thread::ThreadPool >(threads, 1024, "llarp-worker"); worker = std::make_shared< llarp::thread::ThreadPool >(threads, 1024,
"llarp-worker");
nodedb_dir = config->netdb.nodedbDir(); nodedb_dir = config->netdb.nodedbDir();

@ -645,7 +645,7 @@ namespace llarp
// ourKey should never be in the connected list // ourKey should never be in the connected list
// requester is likely in the connected list // requester is likely in the connected list
// 4 or connection nodes (minus a potential requestor), whatever is less // 4 or connection nodes (minus a potential requestor), whatever is less
if(!_nodes->GetManyNearExcluding(t, found, 1, if(!_nodes->GetManyNearExcluding(t, found, nodeCount >= 4 ? 4 : 1,
std::set< Key_t >{ourKey, requester})) std::set< Key_t >{ourKey, requester}))
{ {
llarp::LogError( llarp::LogError(

@ -920,7 +920,6 @@ namespace llarp
std::make_unique< FileLogStream >(diskworker(), logfile, 100, true); std::make_unique< FileLogStream >(diskworker(), logfile, 100, true);
} }
netConfig.insert(conf->dns.netConfig.begin(), conf->dns.netConfig.end()); netConfig.insert(conf->dns.netConfig.begin(), conf->dns.netConfig.end());
std::vector< std::string > configRouters = conf->connect.routers; std::vector< std::string > configRouters = conf->connect.routers;
@ -1074,6 +1073,33 @@ namespace llarp
> 0; > 0;
} }
bool
Router::ShouldReportStats(llarp_time_t now) const
{
static constexpr llarp_time_t ReportStatsInterval = 30 * 1000;
return now - m_LastStatsReport > ReportStatsInterval;
}
void
Router::ReportStats()
{
const auto now = Now();
LogInfo("---- BEGIN REPORT ----");
LogInfo(nodedb()->num_loaded(), " RCs loaded");
LogInfo(bootstrapRCList.size(), " bootstrap peers");
LogInfo(NumberOfConnectedRouters(), " router connections");
if(IsServiceNode())
{
LogInfo(NumberOfConnectedClients(), " client connections");
LogInfo(_rc.Age(now), " ms since we last updated our RC");
LogInfo(_rc.TimeUntilExpires(now), " ms until our RC expires");
}
LogInfo(now, " system time");
LogInfo(m_LastStatsReport, " last reported stats");
LogInfo("----- END REPORT -----");
m_LastStatsReport = now;
}
void void
Router::Tick() Router::Tick()
{ {
@ -1084,7 +1110,51 @@ namespace llarp
routerProfiling().Tick(); routerProfiling().Tick();
if(IsServiceNode()) if(ShouldReportStats(now))
{
ReportStats();
}
const auto insertRouters = [&](const std::vector< RouterContact > &res) {
// store found routers
for(const auto &rc : res)
{
// don't accept expired RCs
if(rc.Verify(Now(), false))
nodedb()->InsertAsync(rc);
}
};
const bool isSvcNode = IsServiceNode();
// try looking up stale routers
nodedb()->VisitInsertedBefore(
[&](const RouterContact &rc) {
if(HasPendingRouterLookup(rc.pubkey))
return;
LookupRouter(rc.pubkey, insertRouters);
},
now - RouterContact::UpdateInterval);
std::set< RouterID > removeStale;
// remove stale routers
const auto timeout = isSvcNode
? RouterContact::Lifetime / 8
: RouterContact::UpdateWindow * RouterContact::UpdateTries;
nodedb()->VisitInsertedBefore(
[&](const RouterContact &rc) {
if(IsBootstrapNode(rc.pubkey))
return;
LogInfo("removing stale router: ", RouterID(rc.pubkey));
removeStale.insert(rc.pubkey);
},
now - timeout);
nodedb()->RemoveIf([removeStale](const RouterContact &rc) -> bool {
return removeStale.count(rc.pubkey) > 0;
});
if(isSvcNode)
{ {
if(_rc.ExpiresSoon(now, randint() % 10000) if(_rc.ExpiresSoon(now, randint() % 10000)
|| (now - _rc.last_updated) > rcRegenInterval) || (now - _rc.last_updated) > rcRegenInterval)
@ -1103,36 +1173,7 @@ namespace llarp
}); });
*/ */
} }
else // expire paths
{
// try looking up stale routers
nodedb()->VisitInsertedBefore(
[&](const RouterContact &rc) {
if(HasPendingRouterLookup(rc.pubkey))
return;
LookupRouter(rc.pubkey,
[&](const std::vector< RouterContact > &result) {
// store found routers
for(const auto &rc : result)
nodedb()->InsertAsync(rc);
});
},
now - RouterContact::UpdateInterval);
std::set< RouterID > removeStale;
// remove stale routers
nodedb()->VisitInsertedBefore(
[&](const RouterContact &rc) {
if(IsBootstrapNode(rc.pubkey))
return;
removeStale.insert(rc.pubkey);
},
now - ((RouterContact::UpdateInterval * 3) / 2));
nodedb()->RemoveIf([removeStale](const RouterContact &rc) -> bool {
return removeStale.count(rc.pubkey) > 0;
});
}
// expire transit paths
paths.ExpirePaths(now); paths.ExpirePaths(now);
{ {
auto itr = pendingEstablishJobs.begin(); auto itr = pendingEstablishJobs.begin();
@ -1215,7 +1256,7 @@ namespace llarp
ConnectToRandomRouters(dlt); ConnectToRandomRouters(dlt);
} }
if(!IsServiceNode()) if(!isSvcNode)
{ {
_hiddenServiceContext.Tick(now); _hiddenServiceContext.Tick(now);
} }

@ -549,6 +549,14 @@ namespace llarp
std::atomic< bool > _stopping; std::atomic< bool > _stopping;
std::atomic< bool > _running; std::atomic< bool > _running;
llarp_time_t m_LastStatsReport = 0;
bool
ShouldReportStats(llarp_time_t now) const;
void
ReportStats();
bool bool
UpdateOurRC(bool rotateKeys = false); UpdateOurRC(bool rotateKeys = false);

@ -36,6 +36,8 @@ namespace llarp
llarp_time_t RouterContact::UpdateInterval = 30 * 60 * 1000; llarp_time_t RouterContact::UpdateInterval = 30 * 60 * 1000;
// 1 minute window for update // 1 minute window for update
llarp_time_t RouterContact::UpdateWindow = 60 * 1000; llarp_time_t RouterContact::UpdateWindow = 60 * 1000;
// try 5 times to update
int RouterContact::UpdateTries = 5;
NetID::NetID(const byte_t *val) : AlignedBuffer< 8 >() NetID::NetID(const byte_t *val) : AlignedBuffer< 8 >()
{ {
@ -235,16 +237,27 @@ namespace llarp
bool bool
RouterContact::IsExpired(llarp_time_t now) const RouterContact::IsExpired(llarp_time_t now) const
{
return Age(now) >= Lifetime;
}
llarp_time_t
RouterContact::TimeUntilExpires(llarp_time_t now) const
{ {
const auto expiresAt = last_updated + Lifetime; const auto expiresAt = last_updated + Lifetime;
return now >= expiresAt; return now < expiresAt ? expiresAt - now : 0;
}
llarp_time_t
RouterContact::Age(llarp_time_t now) const
{
return now > last_updated ? now - last_updated : 0;
} }
bool bool
RouterContact::ExpiresSoon(llarp_time_t now, llarp_time_t dlt) const RouterContact::ExpiresSoon(llarp_time_t now, llarp_time_t dlt) const
{ {
const auto expiresAt = last_updated + Lifetime; return TimeUntilExpires(now) <= dlt;
return expiresAt <= now || expiresAt - now <= dlt;
} }
std::string std::string

@ -71,6 +71,7 @@ namespace llarp
static llarp_time_t Lifetime; static llarp_time_t Lifetime;
static llarp_time_t UpdateInterval; static llarp_time_t UpdateInterval;
static llarp_time_t UpdateWindow; static llarp_time_t UpdateWindow;
static int UpdateTries;
RouterContact() RouterContact()
{ {
@ -179,6 +180,14 @@ namespace llarp
bool bool
IsExpired(llarp_time_t now) const; IsExpired(llarp_time_t now) const;
/// returns time in ms until we expire or 0 if we have expired
llarp_time_t
TimeUntilExpires(llarp_time_t now) const;
/// get the age of this RC in ms
llarp_time_t
Age(llarp_time_t now) const;
bool bool
OtherIsNewer(const RouterContact &other) const OtherIsNewer(const RouterContact &other) const
{ {

Loading…
Cancel
Save