diff --git a/libi2pd/NetDbRequests.cpp b/libi2pd/NetDbRequests.cpp index 11a7a1e8..a75456f2 100644 --- a/libi2pd/NetDbRequests.cpp +++ b/libi2pd/NetDbRequests.cpp @@ -107,11 +107,13 @@ namespace data void NetDbRequests::Start () { + m_LastPoolCleanUpTime = i2p::util::GetSecondsSinceEpoch (); } void NetDbRequests::Stop () { m_RequestedDestinations.clear (); + m_RequestedDestinationsPool.CleanUpMt (); } @@ -119,7 +121,7 @@ namespace data bool isExploratory, bool direct, RequestedDestination::RequestComplete requestComplete) { // request RouterInfo directly - auto dest = std::make_shared (destination, isExploratory, direct); + auto dest = m_RequestedDestinationsPool.AcquireSharedMt (destination, isExploratory, direct); dest->SetRequestComplete (requestComplete); { std::unique_lock l(m_RequestedDestinationsMutex); @@ -182,6 +184,11 @@ namespace data void NetDbRequests::ManageRequests () { uint64_t ts = i2p::util::GetSecondsSinceEpoch (); + if (ts > m_LastPoolCleanUpTime + REQUESTED_DESTINATIONS_POOL_CLEANUP_INTERVAL) + { + m_RequestedDestinationsPool.CleanUpMt (); + m_LastPoolCleanUpTime = ts; + } std::unique_lock l(m_RequestedDestinationsMutex); for (auto it = m_RequestedDestinations.begin (); it != m_RequestedDestinations.end ();) { diff --git a/libi2pd/NetDbRequests.h b/libi2pd/NetDbRequests.h index fb54d0fc..e6eda5a0 100644 --- a/libi2pd/NetDbRequests.h +++ b/libi2pd/NetDbRequests.h @@ -15,17 +15,19 @@ #include #include "Identity.h" #include "RouterInfo.h" +#include "util.h" namespace i2p { namespace data { - const size_t MAX_NUM_REQUEST_ATTEMPTS = 7; + const size_t MAX_NUM_REQUEST_ATTEMPTS = 5; const uint64_t MANAGE_REQUESTS_INTERVAL = 1; // in seconds const uint64_t MIN_REQUEST_TIME = 5; // in seconds const uint64_t MAX_REQUEST_TIME = MAX_NUM_REQUEST_ATTEMPTS * (MIN_REQUEST_TIME + MANAGE_REQUESTS_INTERVAL); const uint64_t MAX_EXPLORATORY_REQUEST_TIME = 30; // in seconds const uint64_t REQUEST_CACHE_TIME = MAX_REQUEST_TIME + 40; // in seconds + const uint64_t REQUESTED_DESTINATIONS_POOL_CLEANUP_INTERVAL = 191; // in seconds class RequestedDestination { @@ -83,6 +85,8 @@ namespace data mutable std::mutex m_RequestedDestinationsMutex; std::unordered_map > m_RequestedDestinations; + i2p::util::MemoryPoolMt m_RequestedDestinationsPool; + uint64_t m_LastPoolCleanUpTime = 0; // in seconds }; } }