From c5644ee3f90cff3a567b71bdf16d9183eb6888de Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 22 Mar 2016 13:10:02 -0400 Subject: [PATCH] hold previous lookup response --- NetDb.cpp | 43 +++++++++++++++++++++++++++++++++++++------ NetDb.h | 3 +++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/NetDb.cpp b/NetDb.cpp index eb1380de..857381d8 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -118,6 +118,7 @@ namespace data { SaveUpdated (); ManageLeaseSets (); + ManageLookupResponses (); } lastSave = ts; } @@ -671,13 +672,31 @@ namespace data if (!replyMsg) { LogPrint (eLogWarning, "NetDb: Requested ", key, " not found. ", numExcluded, " excluded"); - std::set excludedRouters; - for (int i = 0; i < numExcluded; i++) - { - excludedRouters.insert (excluded); - excluded += 32; + // find or cleate response + std::vector closestFloodfills; + bool found = false; + if (!numExcluded) + { + auto it = m_LookupResponses.find (ident); + if (it != m_LookupResponses.end ()) + { + closestFloodfills = it->second.first; + found = true; + } + } + if (!found) + { + std::set excludedRouters; + for (int i = 0; i < numExcluded; i++) + { + excludedRouters.insert (excluded); + excluded += 32; + } + closestFloodfills = GetClosestFloodfills (ident, 3, excludedRouters, true); + if (!numExcluded) // save if no excluded + m_LookupResponses[ident] = std::make_pair(closestFloodfills, i2p::util::GetSecondsSinceEpoch ()); } - replyMsg = CreateDatabaseSearchReply (ident, GetClosestFloodfills (ident, 3, excludedRouters, true)); + replyMsg = CreateDatabaseSearchReply (ident, closestFloodfills); } } @@ -972,5 +991,17 @@ namespace data it++; } } + + void NetDb::ManageLookupResponses () + { + auto ts = i2p::util::GetSecondsSinceEpoch (); + for (auto it = m_LookupResponses.begin (); it != m_LookupResponses.end ();) + { + if (ts > it->second.second + 180) // 3 minutes + it = m_LookupResponses.erase (it); + else + it++; + } + } } } diff --git a/NetDb.h b/NetDb.h index 536ff644..1c062358 100644 --- a/NetDb.h +++ b/NetDb.h @@ -84,6 +84,7 @@ namespace data void Publish (); void ManageLeaseSets (); void ManageRequests (); + void ManageLookupResponses (); template std::shared_ptr GetRandomRouter (Filter filter) const; @@ -108,6 +109,8 @@ namespace data friend class NetDbRequests; NetDbRequests m_Requests; + + std::map, uint64_t> > m_LookupResponses; // ident->(closest FFs, timestamp) }; extern NetDb netdb;