diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
index 29d2c5c8b..56c291c43 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
@@ -121,7 +121,6 @@ public class UpdateHandler {
try {
proxyPort = Integer.parseInt(port);
} catch (NumberFormatException nfe) {
- System.setProperty(PROP_UPDATE_IN_PROGRESS, "false");
return;
}
try {
@@ -135,7 +134,6 @@ public class UpdateHandler {
get.fetch();
} catch (Throwable t) {
_context.logManager().getLog(UpdateHandler.class).error("Error updating", t);
- System.setProperty(PROP_UPDATE_IN_PROGRESS, "false");
}
}
@@ -176,15 +174,14 @@ public class UpdateHandler {
err = err + " from " + url;
_log.log(Log.CRIT, err);
_status = "" + err + "";
- System.setProperty(PROP_UPDATE_IN_PROGRESS, "false");
}
}
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {
- _log.log(Log.CRIT, "Update from " + url + " did not download completely (" + bytesTransferred + " with "
- + bytesRemaining + " after " + currentAttempt + " tries)");
+ // don't display bytesTransferred as it is meaningless
+ _log.log(Log.CRIT, "Update from " + url + " did not download completely (" +
+ bytesRemaining + " remaining after " + currentAttempt + " tries)");
_status = "Transfer failed";
- System.setProperty(PROP_UPDATE_IN_PROGRESS, "false");
}
public void headerReceived(String url, int attemptNum, String key, String val) {}
public void attempting(String url) {}
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index 448774454..62acbfadc 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -214,12 +214,17 @@ public class EepGet {
public static interface StatusListener {
/**
* alreadyTransferred - total of all attempts, not including currentWrite
- * If nonzero on the first call, a partial file of that length was found
+ * If nonzero on the first call, a partial file of that length was found,
+ * _and_ the server supports resume.
+ * If zero on a subsequent call after some bytes are transferred
+ * (and presumably after an attemptFailed), the server does _not_
+ * support resume and we had to start over.
* To track _actual_ transfer if the output file could already exist,
* the listener should keep its own counter,
* or subtract the initial alreadyTransferred value.
+ * And watch out for alreadyTransferred resetting if a resume failed...
* currentWrite - since last call to the listener
- * bytesTransferred - includes headers, retries, redirects, ...
+ * bytesTransferred - includes headers, retries, redirects, discarded partial downloads, ...
* bytesRemaining - on this attempt only, currentWrite already subtracted -
* or -1 if chunked encoding or server does not return a length
*
@@ -239,6 +244,7 @@ public class EepGet {
private long _startedOn;
private long _written;
private long _previousWritten;
+ private long _discarded;
private long _lastComplete;
private boolean _firstTime;
private DecimalFormat _pct = new DecimalFormat("00.0%");
@@ -251,6 +257,7 @@ public class EepGet {
_lineSize = lineSize;
_written = 0;
_previousWritten = 0;
+ _discarded = 0;
_lastComplete = _context.clock().now();
_startedOn = _lastComplete;
_firstTime = true;
@@ -263,6 +270,12 @@ public class EepGet {
}
_firstTime = false;
}
+ if (_written == 0 && alreadyTransferred == 0 && _previousWritten > 0) {
+ // boo
+ System.out.println("Server does not support resume, discarding " + _previousWritten + " bytes");
+ _discarded += _previousWritten;
+ _previousWritten = 0;
+ }
for (int i = 0; i < currentWrite; i++) {
_written++;
if ( (_markSize > 0) && (_written % _markSize == 0) ) {
@@ -318,10 +331,12 @@ public class EepGet {
} else {
if ( bytesRemaining > 0 ) {
System.out.println("== Transfer of " + url + " completed with " + transferred
- + " transferred and " + (bytesRemaining - bytesTransferred) + " remaining");
+ + " transferred and " + (bytesRemaining - bytesTransferred) + " remaining" +
+ (_discarded > 0 ? (" and " + _discarded + " bytes discarded") : ""));
} else {
System.out.println("== Transfer of " + url + " completed with " + transferred
- + " bytes transferred");
+ + " bytes transferred" +
+ (_discarded > 0 ? (" and " + _discarded + " bytes discarded") : ""));
}
if (transferred > 0)
System.out.println("== Output saved to " + outputFile + " (" + alreadyTransferred + " bytes)");
@@ -616,6 +631,8 @@ public class EepGet {
if (_log.shouldLog(Log.DEBUG))
_log.debug("rc: " + responseCode + " for " + _actualURL);
+ if(_transferFailed)
+ _log.error("Already failed for " + _actualURL);
boolean rcOk = false;
switch (responseCode) {
case 200: // full
diff --git a/history.txt b/history.txt
index 9ff73b6a5..95c57b9a4 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,14 @@
+2008-09-06 zzz
+ * EepGet command line: Fix byte counts after a failed resume
+ * NTCP: Mark unreachable on outbound connection timeout
+ * Shitlist: Fix partial shitlisting (still unused though)
+ * Summary Bar: Warn if firewalled and floodfill
+ * Throttle: Combine current and last bw measurement,
+ reduce default max tunnels to 2500 (was 3000)
+ * Tunnel BuildHandler: Logging cleanup
+ * UpdateHandler: Cleanup, clarify failure message
+ * DataHelper: Prepare for 999 day uptime :)
+
2008-08-29 zzz
* Tunnel BuildExecutor: Debug cleanup
* Profiles: Penalize capacity when tunnel build request times out
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index ca960e56f..b48c557f3 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -17,7 +17,7 @@ import net.i2p.CoreVersion;
public class RouterVersion {
public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $";
public final static String VERSION = "0.6.3";
- public final static long BUILD = 2;
+ public final static long BUILD = 3;
public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
System.out.println("Router ID: " + RouterVersion.ID);