From cb139226df1a32b2cf9f3f18b6a47a5e521e4a25 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 30 Dec 2022 18:06:47 -0500 Subject: [PATCH] ilimit umner of simultaneous tunnel build requests per pool --- libi2pd/Tunnel.cpp | 2 +- libi2pd/Tunnel.h | 2 +- libi2pd/TunnelPool.cpp | 22 ++++++++++++++++------ libi2pd/TunnelPool.h | 1 + 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/libi2pd/Tunnel.cpp b/libi2pd/Tunnel.cpp index 519026e8..f3b7152d 100644 --- a/libi2pd/Tunnel.cpp +++ b/libi2pd/Tunnel.cpp @@ -516,7 +516,7 @@ namespace tunnel LogPrint (eLogWarning, "Tunnel: Unexpected message type ", (int) typeID); } - msg = (numMsgs <= MAX_NUM_TUNNEL_MSGS_AT_THE_TIME) ? m_Queue.Get () : nullptr; + msg = (numMsgs <= MAX_TUNNEL_MSGS_BATCH_SIZE) ? m_Queue.Get () : nullptr; if (msg) { prevTunnelID = tunnelID; diff --git a/libi2pd/Tunnel.h b/libi2pd/Tunnel.h index 404dc2f1..6032d35f 100644 --- a/libi2pd/Tunnel.h +++ b/libi2pd/Tunnel.h @@ -40,7 +40,7 @@ namespace tunnel const int STANDARD_NUM_RECORDS = 4; // in VariableTunnelBuild message const int MAX_NUM_RECORDS = 8; const int HIGH_LATENCY_PER_HOP = 250; // in milliseconds - const int MAX_NUM_TUNNEL_MSGS_AT_THE_TIME = 100; // handle message without break + const int MAX_TUNNEL_MSGS_BATCH_SIZE = 100; // handle messages without interrupt const int TUNNEL_MANAGE_INTERVAL = 15; // in seconds const int TUNNEL_POOLS_MANAGE_INTERVAL = 5; // in seconds const int TUNNEL_MEMORY_POOL_MANAGE_INTERVAL = 120; // in seconds diff --git a/libi2pd/TunnelPool.cpp b/libi2pd/TunnelPool.cpp index b87ca048..ef52bf6d 100644 --- a/libi2pd/TunnelPool.cpp +++ b/libi2pd/TunnelPool.cpp @@ -282,9 +282,14 @@ namespace tunnel for (const auto& it : m_OutboundTunnels) if (it->IsEstablished ()) num++; } - for (int i = num; i < m_NumOutboundTunnels; i++) - CreateOutboundTunnel (); - + num = m_NumOutboundTunnels - num; + if (num > 0) + { + if (num > TUNNEL_POOL_MAX_NUM_BUILD_REQUESTS) num = TUNNEL_POOL_MAX_NUM_BUILD_REQUESTS; + for (int i = 0; i < num; i++) + CreateOutboundTunnel (); + } + num = 0; { std::unique_lock l(m_InboundTunnelsMutex); @@ -300,9 +305,14 @@ namespace tunnel if (num >= m_NumInboundTunnels) break; } } - for (int i = num; i < m_NumInboundTunnels; i++) - CreateInboundTunnel (); - + num = m_NumInboundTunnels - num; + if (num > 0) + { + if (num > TUNNEL_POOL_MAX_NUM_BUILD_REQUESTS) num = TUNNEL_POOL_MAX_NUM_BUILD_REQUESTS; + for (int i = 0; i < num; i++) + CreateInboundTunnel (); + } + if (num < m_NumInboundTunnels && m_NumInboundHops <= 0 && m_LocalDestination) // zero hops IB m_LocalDestination->SetLeaseSetUpdated (); // update LeaseSet immediately } diff --git a/libi2pd/TunnelPool.h b/libi2pd/TunnelPool.h index d8c60d69..aed29eaf 100644 --- a/libi2pd/TunnelPool.h +++ b/libi2pd/TunnelPool.h @@ -30,6 +30,7 @@ namespace tunnel const int TUNNEL_POOL_MANAGE_INTERVAL = 10; // in seconds const int TUNNEL_POOL_MAX_INBOUND_TUNNELS_QUANTITY = 16; const int TUNNEL_POOL_MAX_OUTBOUND_TUNNELS_QUANTITY = 16; + const int TUNNEL_POOL_MAX_NUM_BUILD_REQUESTS = 2; class Tunnel; class InboundTunnel;