2005-02-17 jrandom

* Fixed the braindead tunnel testing logic
    * If a large number of tunnels are failing (within the last 5-10 minutes)
      and the current tunnel pool's configuration allows it, randomly build a
      zero hop tunnel to replace failed tunnels.
    * Enable postman's POP3 and SMTP tunnels by default
This commit is contained in:
jrandom
2005-02-17 17:59:27 +00:00
committed by zzz
parent 77176162af
commit dd10747460
6 changed files with 68 additions and 11 deletions

View File

@ -1,4 +1,11 @@
$Id: history.txt,v 1.142 2005/02/16 17:23:47 jrandom Exp $
$Id: history.txt,v 1.143 2005/02/16 23:08:34 jrandom Exp $
2005-02-17 jrandom
* Fixed the braindead tunnel testing logic
* If a large number of tunnels are failing (within the last 5-10 minutes)
and the current tunnel pool's configuration allows it, randomly build a
zero hop tunnel to replace failed tunnels.
* Enable postman's POP3 and SMTP tunnels by default
2005-02-16 jrandom
* Added some error handling when the number of session tags exceeds the

View File

@ -64,7 +64,7 @@ tunnel.4.name=smtp.postman.i2p
tunnel.4.option.tunnels.depthInbound=2
tunnel.4.option.tunnels.numInbound=2
tunnel.4.option.i2p.streaming.connectDelay=1000
tunnel.4.startOnLoad=false
tunnel.4.startOnLoad=true
tunnel.4.targetDestination=smtp.postman.i2p
tunnel.4.type=client
@ -78,6 +78,6 @@ tunnel.5.listenPort=7660
tunnel.5.option.tunnels.depthInbound=2
tunnel.5.option.tunnels.numInbound=2
tunnel.5.option.i2p.streaming.connectDelay=1000
tunnel.5.startOnLoad=false
tunnel.5.startOnLoad=true
tunnel.5.targetDestination=pop.postman.i2p
tunnel.5.type=client

View File

@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
*
*/
public class RouterVersion {
public final static String ID = "$Revision: 1.139 $ $Date: 2005/02/16 17:23:55 $";
public final static String ID = "$Revision: 1.140 $ $Date: 2005/02/16 23:08:35 $";
public final static String VERSION = "0.5-pre";
public final static long BUILD = 13;
public final static long BUILD = 14;
public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION);
System.out.println("Router ID: " + RouterVersion.ID);

View File

@ -54,5 +54,12 @@ class StoreMessageSelector implements MessageSelector {
return false;
}
}
public String toString() {
StringBuffer rv = new StringBuffer(64);
rv.append("Waiting for netDb confirm from ").append(_peer.toBase64()).append(", found? ");
rv.append(_found).append(" waiting for ").append(_waitingForId);
return rv.toString();
}
}

View File

@ -26,6 +26,7 @@ class TestJob extends JobImpl {
private TunnelPool _pool;
private Object _buildToken;
private PooledTunnelCreatorConfig _cfg;
private boolean _found;
/** base to randomize the test delay on */
private static final int TEST_DELAY = 60*1000;
@ -48,6 +49,7 @@ class TestJob extends JobImpl {
}
public String getName() { return "Test tunnel"; }
public void runJob() {
_found = false;
// note: testing with exploratory tunnels always, even if the tested tunnel
// is a client tunnel (per _cfg.getDestination())
TunnelInfo replyTunnel = null;
@ -150,7 +152,6 @@ class TestJob extends JobImpl {
private RouterContext _context;
private long _id;
private long _expiration;
private boolean _found;
public ReplySelector(RouterContext ctx, long id, long expiration) {
_context = ctx;
_id = id;
@ -158,7 +159,7 @@ class TestJob extends JobImpl {
_found = false;
}
public boolean continueMatching() { return _found && _context.clock().now() < _expiration; }
public boolean continueMatching() { return !_found && _context.clock().now() < _expiration; }
public long getExpiration() { return _expiration; }
public boolean isMatch(I2NPMessage message) {
if (message instanceof DeliveryStatusMessage) {
@ -167,6 +168,12 @@ class TestJob extends JobImpl {
return false;
}
public String toString() {
StringBuffer rv = new StringBuffer(64);
rv.append("Testing tunnel ").append(_cfg.toString()).append(" waiting for ");
rv.append(_id).append(" found? ").append(_found);
return rv.toString();
}
}
/**
@ -181,12 +188,19 @@ class TestJob extends JobImpl {
testSuccessful((int)_successTime);
else
testFailed(_successTime);
_found = true;
}
// who cares about the details...
public void setMessage(I2NPMessage message) {
_successTime = getContext().clock().now() - ((DeliveryStatusMessage)message).getArrival();
}
public String toString() {
StringBuffer rv = new StringBuffer(64);
rv.append("Testing tunnel ").append(_cfg.toString());
rv.append(" successful after ").append(_successTime);
return rv.toString();
}
}
/**
@ -200,7 +214,15 @@ class TestJob extends JobImpl {
}
public String getName() { return "Tunnel test timeout"; }
public void runJob() {
testFailed(getContext().clock().now() - _started);
if (!_found)
testFailed(getContext().clock().now() - _started);
}
public String toString() {
StringBuffer rv = new StringBuffer(64);
rv.append("Testing tunnel ").append(_cfg.toString());
rv.append(" timed out");
return rv.toString();
}
}
}

View File

@ -6,6 +6,8 @@ import java.util.List;
import net.i2p.data.Hash;
import net.i2p.data.SessionKey;
import net.i2p.data.SessionTag;
import net.i2p.stat.Rate;
import net.i2p.stat.RateStat;
import net.i2p.router.RouterContext;
import net.i2p.router.JobImpl;
import net.i2p.router.tunnel.HopConfig;
@ -59,9 +61,17 @@ public class TunnelBuilder {
TunnelPoolSettings settings = pool.getSettings();
long expiration = ctx.clock().now() + settings.getDuration();
List peers = null;
if (fake) {
long failures = countFailures(ctx);
boolean failing = (failures > 5) && (pool.getSettings().getAllowZeroHop());
boolean failsafe = false;
if (failing && (ctx.random().nextInt(100) < failures) )
failsafe = true;
if (fake || failsafe) {
peers = new ArrayList(1);
peers.add(ctx.routerHash());
if ( (failsafe) && (log.shouldLog(Log.WARN)) )
log.warn("Building failsafe tunnel for " + pool);
} else {
peers = pool.getSelector().selectPeers(ctx, settings);
}
@ -97,7 +107,18 @@ public class TunnelBuilder {
l.debug("Config contains " + peers + ": " + cfg);
return cfg;
}
private long countFailures(RouterContext ctx) {
RateStat rs = ctx.statManager().getRate("tunnel.testFailedTime");
if (rs == null)
return 0;
Rate r = rs.getRate(10*60*1000);
if (r == null)
return 0;
else
return r.getCurrentEventCount();
}
/**
* If the building fails, try, try again.
*