diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java index 0583c73b1..1d0f4f54c 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java @@ -65,6 +65,7 @@ class BuildHandler { _context.statManager().createRateStat("tunnel.rejectOverloaded", "How long we had to wait before processing the request (when it was rejected)", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.acceptLoad", "Delay before processing the accepted request", "Tunnels", new long[] { 60*1000, 10*60*1000 }); + _context.statManager().createRateStat("tunnel.dropConnLimits", "Drop instead of reject due to conn limits", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.dropLoad", "How long we had to wait before finally giving up on an inbound request (period is queue count)?", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.dropLoadDelay", "How long we had to wait before finally giving up on an inbound request?", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.dropLoadBacklog", "How many requests were pending when they were so lagged that we had to drop a new inbound request??", "Tunnels", new long[] { 60*1000, 10*60*1000 }); @@ -466,7 +467,6 @@ class BuildHandler { return 0; } - private static final String PROP_REJECT_NONPARTICIPANT = "router.participantOnly"; private void handleReq(RouterInfo nextPeerInfo, BuildMessageState state, BuildRequestRecord req, Hash nextPeer) { long ourId = req.readReceiveTunnelId(); long nextId = req.readNextTunnelId(); @@ -569,6 +569,17 @@ class BuildHandler { (isOutEnd ? "outbound endpoint" : isInGW ? "inbound gw" : "participant")); } + // Connection congestion control: + // If we rejected the request, are near our conn limits, and aren't connected to the next hop, + // just drop it. + if (response != 0 && + (! _context.routerHash().equals(nextPeer)) && + (! _context.commSystem().haveOutboundCapacity()) && + (! _context.commSystem().isEstablished(nextPeer))) { + _context.statManager().addRateData("tunnel.dropConnLimits", 1, 0); + return; + } + BuildResponseRecord resp = new BuildResponseRecord(); byte reply[] = resp.create(_context, response, req.readReplyKey(), req.readReplyIV(), state.msg.getUniqueId()); for (int j = 0; j < TunnelBuildMessage.RECORD_COUNT; j++) {