* Tunnel Testing:

- Fix counting so it really takes 4 consecutive failures
        rather than 4 total to remove a tunnel
      - Credit or blame goes to the exploratory tunnel as well
        as the tunnel being tested
      - Adjust tunnel test timeout based on tunnel length
    * ExploratoryPeerSelector: Tweak logging
    * ProfileOrganizer: Adjust integration calculation again
    * build.xml: Add to help
    * checklist.txt: Tweak
    * readme.html: Fix forum links
    * netDb: Remove tunnel.testFailedTime
This commit is contained in:
zzz
2008-03-22 13:07:38 +00:00
parent 0556f15068
commit 9500a55532
11 changed files with 65 additions and 19 deletions

View File

@@ -3,7 +3,8 @@
<target name="all" > <target name="all" >
<echo message="Useful targets: " /> <echo message="Useful targets: " />
<echo message=" dist: distclean then package everything up (installer, clean tarball, update tarball)" /> <echo message=" pkg: distclean then package everything up (installer, clean tarball, update tarball)" />
<echo message=" dist: pkg and javadoc" />
<echo message=" installer: build the GUI installer" /> <echo message=" installer: build the GUI installer" />
<echo message=" tarball: tar the full install into i2p.tar.bz2 (extracts to build a new clean install)" /> <echo message=" tarball: tar the full install into i2p.tar.bz2 (extracts to build a new clean install)" />
<echo message=" updater: tar the built i2p specific files into an i2pupdate.zip (extracts safely over existing installs)" /> <echo message=" updater: tar the built i2p specific files into an i2pupdate.zip (extracts safely over existing installs)" />

View File

@@ -15,7 +15,7 @@ Change revision in:
core/java/src/net/i2p/CoreVersion.java core/java/src/net/i2p/CoreVersion.java
Build and tag: Build and tag:
ant dist ant pkg
mtn ci mtn ci
mtn tag h: i2p-0.6.1.xx mtn tag h: i2p-0.6.1.xx
Sync with mtn.i2p2.i2p Sync with mtn.i2p2.i2p

View File

@@ -1,7 +1,22 @@
2008-03-22 zzz
* Tunnel Testing:
- Fix counting so it really takes 4 consecutive failures
rather than 4 total to remove a tunnel
- Credit or blame goes to the exploratory tunnel as well
as the tunnel being tested
- Adjust tunnel test timeout based on tunnel length
* ExploratoryPeerSelector: Tweak logging
* ProfileOrganizer: Adjust integration calculation again
* build.xml: Add to help
* checklist.txt: Tweak
* readme.html: Fix forum links
* netDb: Remove tunnel.testFailedTime
2008-03-19 zzz 2008-03-19 zzz
* ExploratoryPeerSelector: * ExploratoryPeerSelector:
- Exclude floodfill peers - Exclude floodfill peers
- Tweak the HighCap vs. NonFailing decision - Tweak the HighCap vs. NonFailing decision; try NonFailing
at least a minimum % of the time
* i2psnark: Increase retries for .torrent fetch * i2psnark: Increase retries for .torrent fetch
* IRC Proxy: Prevent mIRC from sending an alternate DCC request * IRC Proxy: Prevent mIRC from sending an alternate DCC request
containing an IP containing an IP

View File

@@ -9,7 +9,7 @@ you can:</p>
<ul> <ul>
<li><a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p</a> and <li><a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p</a> and
<a href="http://perv.i2p/stats.cgi">perv.i2p</a>: sites tracking active eepsites</li> <a href="http://perv.i2p/stats.cgi">perv.i2p</a>: sites tracking active eepsites</li>
<li><a href="http://forum.i2p/">forum.i2p</a>: a secure and anonymous connection to <a href="http://forum.i2p.net/">forum.i2p.net</a></li> <li><a href="http://forum.i2p/">forum.i2p</a>: a secure and anonymous connection to <a href="http://forum.i2p2.de/">forum.i2p2.de</a></li>
<li><a href="http://www.i2p2.i2p/">www.i2p2.i2p</a> and mirror <a href="http://i2p-projekt.i2p">i2p-projekt.i2p</a>: <li><a href="http://www.i2p2.i2p/">www.i2p2.i2p</a> and mirror <a href="http://i2p-projekt.i2p">i2p-projekt.i2p</a>:
secure and anonymous connections to <a href="http://www.i2p2.de/">www.i2p2.de</a></li> secure and anonymous connections to <a href="http://www.i2p2.de/">www.i2p2.de</a></li>
<li><a href="http://eepsites.i2p/">eepsites.i2p</a>: an anonymously hosted search engine of eepsites</li> <li><a href="http://eepsites.i2p/">eepsites.i2p</a>: an anonymously hosted search engine of eepsites</li>
@@ -59,7 +59,7 @@ If you cannot see any eepsites at all (even <a href="http://www.i2p2.i2p/">www.i
be sure your browser proxy is set to localhost port 4444. be sure your browser proxy is set to localhost port 4444.
You may also want to review the information on the You may also want to review the information on the
<a href="http://www.i2p2.i2p/">I2P website</a>, post up messages to the <a href="http://www.i2p2.i2p/">I2P website</a>, post up messages to the
<a href="http://forum.i2p.net/">I2P discussion forum</a>, or swing by #i2p or <a href="http://forum.i2p2.de/">I2P discussion forum</a>, or swing by #i2p or
#i2p-chat on IRC at <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p or irc.freshcoffee.i2p (they're linked together).</p> #i2p-chat on IRC at <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p or irc.freshcoffee.i2p (they're linked together).</p>
<p><b>As a note, you can change this page by editing the file "docs/readme.html"</b></p> <p><b>As a note, you can change this page by editing the file "docs/readme.html"</b></p>

View File

@@ -17,7 +17,7 @@ import net.i2p.CoreVersion;
public class RouterVersion { public class RouterVersion {
public final static String ID = "$Revision: 1.548 $ $Date: 2008-02-10 15:00:00 $"; public final static String ID = "$Revision: 1.548 $ $Date: 2008-02-10 15:00:00 $";
public final static String VERSION = "0.6.1.32"; public final static String VERSION = "0.6.1.32";
public final static long BUILD = 8; public final static long BUILD = 9;
public static void main(String args[]) { public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
System.out.println("Router ID: " + RouterVersion.ID); System.out.println("Router ID: " + RouterVersion.ID);

View File

@@ -136,6 +136,7 @@ public class StatisticsManager implements Service {
//includeRate("tunnel.fragmentedDropped", stats, new long[] { 10*60*1000, 3*60*60*1000 }); //includeRate("tunnel.fragmentedDropped", stats, new long[] { 10*60*1000, 3*60*60*1000 });
//includeRate("tunnel.fullFragments", stats, new long[] { 10*60*1000, 3*60*60*1000 }); //includeRate("tunnel.fullFragments", stats, new long[] { 10*60*1000, 3*60*60*1000 });
//includeRate("tunnel.smallFragments", stats, new long[] { 10*60*1000, 3*60*60*1000 }); //includeRate("tunnel.smallFragments", stats, new long[] { 10*60*1000, 3*60*60*1000 });
if (commentMeOutInDot33)
includeRate("tunnel.testFailedTime", stats, new long[] { 10*60*1000 }); includeRate("tunnel.testFailedTime", stats, new long[] { 10*60*1000 });
includeRate("tunnel.buildFailure", stats, new long[] { 60*60*1000 }); includeRate("tunnel.buildFailure", stats, new long[] { 60*60*1000 });

View File

@@ -20,9 +20,10 @@ public class IntegrationCalculator extends Calculator {
public double calc(PeerProfile profile) { public double calc(PeerProfile profile) {
// give more weight to recent counts // give more weight to recent counts
long val = profile.getDbIntroduction().getRate(24*60*60*1000l).getCurrentEventCount(); long val = profile.getDbIntroduction().getRate(24*60*60*1000l).getCurrentEventCount();
val += 2 * 4 * profile.getDbIntroduction().getRate(6*60*60*1000l).getCurrentEventCount(); val += 2 * 4 * profile.getDbIntroduction().getRate(6*60*60*1000l).getLastEventCount();
val += 3 * 4 * profile.getDbIntroduction().getRate(6*60*60*1000l).getCurrentEventCount();
val += 4 * 24 * profile.getDbIntroduction().getRate(60*60*1000l).getCurrentEventCount(); val += 4 * 24 * profile.getDbIntroduction().getRate(60*60*1000l).getCurrentEventCount();
val /= 7; val /= 10;
val += profile.getIntegrationBonus(); val += profile.getIntegrationBonus();
return val; return val;
} }

View File

@@ -137,10 +137,11 @@ public class TunnelCreatorConfig implements TunnelInfo {
} }
// Make configurable? - but can't easily get to pool options from here
private static final int MAX_CONSECUTIVE_TEST_FAILURES = 3; private static final int MAX_CONSECUTIVE_TEST_FAILURES = 3;
/** /**
* The tunnel failed, so stop using it * The tunnel failed a test, so (maybe) stop using it
*/ */
public boolean tunnelFailed() { public boolean tunnelFailed() {
_failures++; _failures++;
@@ -155,11 +156,8 @@ public class TunnelCreatorConfig implements TunnelInfo {
public int getTunnelFailures() { return _failures; } public int getTunnelFailures() { return _failures; }
public void testSuccessful(int ms) { public void testSuccessful(int ms) {
int failures = _failures - 1; if (!_failed)
if (failures < 0)
_failures = 0; _failures = 0;
else
_failures = failures;
} }
public String toString() { public String toString() {

View File

@@ -73,13 +73,13 @@ class ExploratoryPeerSelector extends TunnelPeerSelector {
failPct = 100 - MIN_NONFAILING_PCT; failPct = 100 - MIN_NONFAILING_PCT;
} else { } else {
failPct = getExploratoryFailPercentage(ctx); failPct = getExploratoryFailPercentage(ctx);
Log l = ctx.logManager().getLog(getClass());
if (l.shouldLog(Log.DEBUG))
l.debug("Fail pct: " + failPct);
// always try a little, this helps keep the failPct stat accurate too // always try a little, this helps keep the failPct stat accurate too
if (failPct > 100 - MIN_NONFAILING_PCT) if (failPct > 100 - MIN_NONFAILING_PCT)
failPct = 100 - MIN_NONFAILING_PCT; failPct = 100 - MIN_NONFAILING_PCT;
} }
Log l = ctx.logManager().getLog(getClass());
if (l.shouldLog(Log.DEBUG))
l.error("Fail pct: " + failPct);
return (failPct >= ctx.random().nextInt(100)); return (failPct >= ctx.random().nextInt(100));
} }

View File

@@ -29,6 +29,7 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
_live = false; _live = false;
} }
// calls TestJob
public void testSuccessful(int ms) { public void testSuccessful(int ms) {
if (_testJob != null) if (_testJob != null)
_testJob.testSuccessful(ms); _testJob.testSuccessful(ms);
@@ -36,8 +37,14 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
_live = true; _live = true;
} }
// called from TestJob
public void testJobSuccessful(int ms) {
super.testSuccessful(ms);
_live = true;
}
/** /**
* The tunnel failed, so stop using it * The tunnel failed a test, so (maybe) stop using it
*/ */
public boolean tunnelFailed() { public boolean tunnelFailed() {
boolean rv = super.tunnelFailed(); boolean rv = super.tunnelFailed();

View File

@@ -27,6 +27,7 @@ class TestJob extends JobImpl {
private boolean _found; private boolean _found;
private TunnelInfo _outTunnel; private TunnelInfo _outTunnel;
private TunnelInfo _replyTunnel; private TunnelInfo _replyTunnel;
private PooledTunnelCreatorConfig _otherTunnel;
/** base to randomize the test delay on */ /** base to randomize the test delay on */
private static final int TEST_DELAY = 30*1000; private static final int TEST_DELAY = 30*1000;
@@ -78,9 +79,11 @@ class TestJob extends JobImpl {
if (_cfg.isInbound()) { if (_cfg.isInbound()) {
_replyTunnel = _cfg; _replyTunnel = _cfg;
_outTunnel = getContext().tunnelManager().selectOutboundTunnel(); _outTunnel = getContext().tunnelManager().selectOutboundTunnel();
_otherTunnel = (PooledTunnelCreatorConfig) _outTunnel;
} else { } else {
_replyTunnel = getContext().tunnelManager().selectInboundTunnel(); _replyTunnel = getContext().tunnelManager().selectInboundTunnel();
_outTunnel = _cfg; _outTunnel = _cfg;
_otherTunnel = (PooledTunnelCreatorConfig) _replyTunnel;
} }
if ( (_replyTunnel == null) || (_outTunnel == null) ) { if ( (_replyTunnel == null) || (_outTunnel == null) ) {
@@ -156,6 +159,13 @@ class TestJob extends JobImpl {
noteSuccess(ms, _outTunnel); noteSuccess(ms, _outTunnel);
noteSuccess(ms, _replyTunnel); noteSuccess(ms, _replyTunnel);
_cfg.testJobSuccessful(ms);
// credit the expl. tunnel too
if (_otherTunnel.getLength() > 1)
_otherTunnel.testJobSuccessful(ms);
if (_log.shouldLog(Log.DEBUG))
_log.debug("Tunnel test successful in " + ms + "ms: " + _cfg);
scheduleRetest(); scheduleRetest();
} }
@@ -178,6 +188,9 @@ class TestJob extends JobImpl {
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("Tunnel test failed in " + timeToFail + "ms: " + _cfg); _log.warn("Tunnel test failed in " + timeToFail + "ms: " + _cfg);
boolean keepGoing = _cfg.tunnelFailed(); boolean keepGoing = _cfg.tunnelFailed();
// blame the expl. tunnel too
if (_otherTunnel.getLength() > 1)
_otherTunnel.tunnelFailed();
if (keepGoing) { if (keepGoing) {
scheduleRetest(true); scheduleRetest(true);
} else { } else {
@@ -190,8 +203,18 @@ class TestJob extends JobImpl {
/** randomized time we should wait before testing */ /** randomized time we should wait before testing */
private int getDelay() { return TEST_DELAY + getContext().random().nextInt(TEST_DELAY); } private int getDelay() { return TEST_DELAY + getContext().random().nextInt(TEST_DELAY); }
/** how long we allow tests to run for before failing them */ /** how long we allow tests to run for before failing them */
private int getTestPeriod() { return 15*1000; } private int getTestPeriod() {
if (_outTunnel == null || _replyTunnel == null)
return 15*1000;
// Give it 2.5s per hop + 5s (2 hop tunnel = length 3, so this will be 15s for two 2-hop tunnels)
// Minimum is 7.5s (since a 0-hop could be the expl. tunnel, but only >= 1-hop client tunnels are tested)
// Network average for success is about 1.5s.
// Another possibility - make configurable via pool options
return 2500 * (_outTunnel.getLength() + _replyTunnel.getLength());
}
private void scheduleRetest() { scheduleRetest(false); } private void scheduleRetest() { scheduleRetest(false); }
private void scheduleRetest(boolean asap) { private void scheduleRetest(boolean asap) {
if (asap) { if (asap) {
@@ -286,4 +309,4 @@ class TestJob extends JobImpl {
return rv.toString(); return rv.toString();
} }
} }
} }