From f98a6fb6656abf2adaf7880be1a7d30f92e11c9c Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 24 Feb 2016 11:31:14 -0500 Subject: [PATCH 1/2] tighten RouterInfo expiration --- NetDb.cpp | 55 +++++++++++++------------------------------------------ NetDb.h | 6 ++++++ 2 files changed, 19 insertions(+), 42 deletions(-) diff --git a/NetDb.cpp b/NetDb.cpp index aa7eb433..223d3085 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -294,7 +294,7 @@ namespace data { auto r = std::make_shared(path); if (r->GetRouterIdentity () && !r->IsUnreachable () && - (!r->UsesIntroducer () || m_LastLoad < r->GetTimestamp () + 3600*1000LL)) // 1 hour + (!r->UsesIntroducer () || m_LastLoad < r->GetTimestamp () + NETDB_INTRODUCEE_EXPIRATION_TIMEOUT*1000LL)) // 1 hour { r->DeleteBuffer (); r->ClearProperties (); // properties are not used for regular routers @@ -329,7 +329,13 @@ namespace data { int updatedCount = 0, deletedCount = 0; auto total = m_RouterInfos.size (); + uint64_t expirationTimeout = NETDB_MAX_EXPIRATION_TIMEOUT*1000LL; uint64_t ts = i2p::util::GetMillisecondsSinceEpoch(); + // routers don't expire if less than 90 or uptime is less than 1 hour + bool checkForExpiration = total > NETDB_MIN_ROUTERS && ts > (i2p::context.GetStartupTime () + 3600)*1000LL; + if (checkForExpiration) + expirationTimeout = i2p::context.IsFloodfill () ? NETDB_FLOODFILL_EXPIRATION_TIMEOUT*1000LL : + NETDB_MIN_EXPIRATION_TIMEOUT*1000LL + (NETDB_MAX_EXPIRATION_TIMEOUT - NETDB_MIN_EXPIRATION_TIMEOUT)*1000LL*NETDB_MIN_ROUTERS/total; for (auto it: m_RouterInfos) { @@ -344,53 +350,18 @@ namespace data updatedCount++; continue; } - // find & mark unreachable routers - if (it.second->UsesIntroducer () && ts > it.second->GetTimestamp () + 3600*1000LL) + // find & mark expired routers + if (it.second->UsesIntroducer ()) { + if (ts > it.second->GetTimestamp () + NETDB_INTRODUCEE_EXPIRATION_TIMEOUT*1000LL) // RouterInfo expires after 1 hour if uses introducer - it.second->SetUnreachable (true); - } - else if (total > 75 && ts > (i2p::context.GetStartupTime () + 600)*1000LL) - { - // routers don't expire if less than 25 or uptime is less than 10 minutes - if (i2p::context.IsFloodfill ()) - { - if (ts > it.second->GetTimestamp () + 3600*1000LL) - { // 1 hour - it.second->SetUnreachable (true); - total--; - } - } - else if (total > 2500) - { - if (ts > it.second->GetTimestamp () + 12*3600*1000LL) // 12 hours - { - it.second->SetUnreachable (true); - total--; - } - } - else if (total > 300) - { - if (ts > it.second->GetTimestamp () + 30*3600*1000LL) // 30 hours - { - it.second->SetUnreachable (true); - total--; - } - } - else if (total > 120) - { - if (ts > it.second->GetTimestamp () + 72*3600*1000LL) - { - // 72 hours - it.second->SetUnreachable (true); - total--; - } - } + it.second->SetUnreachable (true); } + else if (checkForExpiration && ts > it.second->GetTimestamp () + expirationTimeout) + it.second->SetUnreachable (true); if (it.second->IsUnreachable ()) { - total--; // delete RI file m_Storage.Remove(ident); deletedCount++; diff --git a/NetDb.h b/NetDb.h index 7efbfcf2..7b196330 100644 --- a/NetDb.h +++ b/NetDb.h @@ -24,6 +24,12 @@ namespace i2p { namespace data { + const int NETDB_MIN_ROUTERS = 90; + const int NETDB_FLOODFILL_EXPIRATION_TIMEOUT = 60*60; // 1 hour, in seconds + const int NETDB_INTRODUCEE_EXPIRATION_TIMEOUT = 65*60; + const int NETDB_MIN_EXPIRATION_TIMEOUT = 90*60; // 1.5 hours + const int NETDB_MAX_EXPIRATION_TIMEOUT = 27*60*60; // 27 hours + class NetDb { public: From 7d660192201b122400d5047ec8cd1cd92501feb2 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 24 Feb 2016 11:50:56 -0500 Subject: [PATCH 2/2] start checking for expiration after 10 minutes --- NetDb.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/NetDb.cpp b/NetDb.cpp index 223d3085..501852bb 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -329,13 +329,13 @@ namespace data { int updatedCount = 0, deletedCount = 0; auto total = m_RouterInfos.size (); - uint64_t expirationTimeout = NETDB_MAX_EXPIRATION_TIMEOUT*1000LL; + uint64_t expirationTimeout = NETDB_MAX_EXPIRATION_TIMEOUT*1000LL; uint64_t ts = i2p::util::GetMillisecondsSinceEpoch(); // routers don't expire if less than 90 or uptime is less than 1 hour - bool checkForExpiration = total > NETDB_MIN_ROUTERS && ts > (i2p::context.GetStartupTime () + 3600)*1000LL; - if (checkForExpiration) + bool checkForExpiration = total > NETDB_MIN_ROUTERS && ts > (i2p::context.GetStartupTime () + 600)*1000LL; // 10 minutes + if (checkForExpiration && ts > (i2p::context.GetStartupTime () + 3600)*1000LL) // 1 hour expirationTimeout = i2p::context.IsFloodfill () ? NETDB_FLOODFILL_EXPIRATION_TIMEOUT*1000LL : - NETDB_MIN_EXPIRATION_TIMEOUT*1000LL + (NETDB_MAX_EXPIRATION_TIMEOUT - NETDB_MIN_EXPIRATION_TIMEOUT)*1000LL*NETDB_MIN_ROUTERS/total; + NETDB_MIN_EXPIRATION_TIMEOUT*1000LL + (NETDB_MAX_EXPIRATION_TIMEOUT - NETDB_MIN_EXPIRATION_TIMEOUT)*1000LL*NETDB_MIN_ROUTERS/total; for (auto it: m_RouterInfos) { @@ -365,6 +365,7 @@ namespace data // delete RI file m_Storage.Remove(ident); deletedCount++; + if (total - deletedCount < NETDB_MIN_ROUTERS) checkForExpiration = false; } } // m_RouterInfos iteration