diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java index 0fca44cc42c7e81e19ffaf674c40d350c6d88758..06a9b499913f2890f90f10dec628e047417d8f7d 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java @@ -468,7 +468,9 @@ public class TunnelPool { if (_tunnels.size() < wanted) { if (_log.shouldLog(Log.WARN)) _log.warn(toString() + ": Not enough tunnels (" + _tunnels.size() + ", wanted " + wanted + ")"); - return null; + // see comment below + if (_tunnels.size() <= 0) + return null; } long expireAfter = _context.clock().now(); // + _settings.getRebuildPeriod(); @@ -492,15 +494,26 @@ public class TunnelPool { leases.add(lease); } + // Go ahead and use less leases for now, hopefully a new tunnel will be built soon + // and we will get called again to generate a full leaseset. + // For clients with high tunnel count or length, + // this will make startup considerably faster, and reduce loss of leaseset + // when one tunnel is lost, thus making us much more robust. + // This also helps when returning to full lease count after reduce-on-idle + // or close-on-idle. + // So we will generate a succession of leases at startup. That's OK. + // Do we want a config option for this, or are there times when we shouldn't do this? if (leases.size() < wanted) { if (_log.shouldLog(Log.WARN)) _log.warn(toString() + ": Not enough leases (" + leases.size() + ", wanted " + wanted + ")"); - return null; + if (leases.size() <= 0) + return null; } LeaseSet ls = new LeaseSet(); Iterator iter = leases.iterator(); - for (int i = 0; i < wanted; i++) + int count = Math.min(leases.size(), wanted); + for (int i = 0; i < count; i++) ls.addLease((Lease) iter.next()); if (_log.shouldLog(Log.INFO)) _log.info(toString() + ": built new leaseSet: " + ls);