diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
index bcb2af1d5..8965eabc8 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
@@ -63,6 +63,8 @@ public class ConfigStatsHandler extends FormHandler {
if (_explicitFilter) {
_stats.clear();
+ if (_explicitFilterValue == null)
+ _explicitFilterValue = "";
if (_explicitFilterValue.indexOf(',') != -1) {
StringTokenizer tok = new StringTokenizer(_explicitFilterValue, ",");
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java
index 0ff9f746f..d4e0751f2 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java
@@ -236,14 +236,14 @@ public class PacketHandler {
}
packet.releasePayload();
} else {
- if (_log.shouldLog(Log.DEBUG) && !packet.isFlagSet(Packet.FLAG_SYNCHRONIZE))
- _log.debug("Packet received on an unknown stream (and not an ECHO or SYN): " + packet);
+ //if (_log.shouldLog(Log.DEBUG) && !packet.isFlagSet(Packet.FLAG_SYNCHRONIZE))
+ // _log.debug("Packet received on an unknown stream (and not an ECHO or SYN): " + packet);
if (sendId <= 0) {
Connection con = _manager.getConnectionByOutboundId(packet.getReceiveStreamId());
if (con != null) {
if ( (con.getHighestAckedThrough() <= 5) && (packet.getSequenceNum() <= 5) ) {
- if (_log.shouldLog(Log.DEBUG))
- _log.debug("Received additional packets before the syn on " + con + ": " + packet);
+ //if (_log.shouldLog(Log.DEBUG))
+ // _log.debug("Received additional packets before the syn on " + con + ": " + packet);
receiveKnownCon(con, packet);
return;
} else {
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
index c6a19bac3..c662bc0cd 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
@@ -14,6 +14,7 @@ import net.i2p.data.*;
import net.i2p.syndie.*;
import net.i2p.syndie.data.*;
import net.i2p.syndie.sml.*;
+import net.i2p.util.FileUtil;
import net.i2p.util.Log;
/**
@@ -75,7 +76,7 @@ public abstract class BaseServlet extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
- resp.setContentType("text/html");
+ resp.setContentType("text/html;charset=UTF-8");
User user = (User)req.getSession().getAttribute("user");
String login = req.getParameter("login");
@@ -488,7 +489,27 @@ public abstract class BaseServlet extends HttpServlet {
}
protected void renderBegin(User user, HttpServletRequest req, PrintWriter out, ThreadIndex index) throws IOException {
- out.write("\n
\n");
@@ -899,8 +920,13 @@ public abstract class BaseServlet extends HttpServlet {
}
}
- private static final String BEGIN_HTML = "\n" +
-"\n" +
-"\n" +
-"\n" +
-"\n" +
-"Jump to the beginning of the first post rendered, if any\n" +
-"Jump to the thread navigation\n\n" +
-"\n";
+"}\n";
+
private static final String END_HTML = " \n" +
"\n";
diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java
index ef5370150..b66749c0d 100644
--- a/core/java/src/net/i2p/data/DataHelper.java
+++ b/core/java/src/net/i2p/data/DataHelper.java
@@ -818,7 +818,7 @@ public class DataHelper {
return ms + "ms";
} else if (ms < 5 * 60 * 1000) {
return (ms / 1000) + "s";
- } else if (ms < 90 * 60 * 1000) {
+ } else if (ms < 120 * 60 * 1000) {
return (ms / (60 * 1000)) + "m";
} else if (ms < 3 * 24 * 60 * 60 * 1000) {
return (ms / (60 * 60 * 1000)) + "h";
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index e3dde46b8..aa1f02709 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -631,7 +631,8 @@ public class EepGet {
buf.append(_alreadyTransferred);
buf.append("-\r\n");
}
- buf.append("Accept-Encoding: identity;q=1, *;q=0\r\n");
+ buf.append("Accept-Encoding: \r\n");
+ buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n");
if (!_allowCaching) {
buf.append("Cache-control: no-cache\r\n");
buf.append("Pragma: no-cache\r\n");
diff --git a/history.txt b/history.txt
index 641f00295..a8b1c941f 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,15 @@
-$Id: history.txt,v 1.333 2005/11/26 11:51:20 jrandom Exp $
+$Id: history.txt,v 1.334 2005/11/26 13:26:24 jrandom Exp $
+
+2005-11-27 jrandom
+ * Inlined the Syndie CSS to reduce the number of HTTP requests (and
+ because firefox [and others?] delay rendering until they fetch the css).
+ * Make sure we fire the shutdown tasks when regenerating a new identity
+ (thanks picsou!)
+ * Cleaned up some of the things I b0rked in the 'dynamic keys' mode
+ * Don't drop SSU sessions if they're still transmitting data successfully,
+ even if there are transmission failures
+ * Adjusted the time summarization to display hours after 119m, not 90m
+ * Further EepGet cleanup (grr)
* 2005-11-26 0.6.1.6 released
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index c9d3baf68..ceeed8966 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -38,8 +38,6 @@ import net.i2p.data.i2np.GarlicMessage;
import net.i2p.router.message.GarlicMessageHandler;
//import net.i2p.router.message.TunnelMessageHandler;
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
-import net.i2p.router.transport.udp.UDPTransport;
-import net.i2p.router.transport.udp.UDPAddress;
import net.i2p.router.startup.StartupJob;
import net.i2p.stat.Rate;
import net.i2p.stat.RateStat;
@@ -218,51 +216,6 @@ public class Router {
_context.jobQueue().addJob(new PersistRouterInfoJob());
}
- /**
- * Called when our RouterInfo is loaded by LoadRouterInfoJob
- * to store our most recently known address to determine if
- * it has changed while we were down.
- */
- public boolean updateExternalAddress(Collection addrs, boolean reboot) {
- if ("false".equalsIgnoreCase(_context.getProperty(Router.PROP_DYNAMIC_KEYS, "false")))
- return false; // no one cares. pretend it didn't change
- boolean ret = false;
- for (Iterator i = addrs.iterator(); i.hasNext(); ) {
- RouterAddress addr = (RouterAddress)i.next();
- if (UDPTransport.STYLE.equalsIgnoreCase(addr.getTransportStyle()))
- ret = updateExternalAddress(addr, reboot);
- }
- return ret;
- }
-
- /**
- * Called by TransportImpl.replaceAddress to notify the router of an
- * address change. It is the caller's responsibility to make sure this
- * really is a substantial change.
- *
- */
- public boolean updateExternalAddress(RouterAddress addr, boolean rebootRouter) {
- String newExternal = null;
- // TCP is often incorrectly initialized to 83.246.74.28 for some
- // reason. Numerous hosts in the netdb report this address for TCP.
- // It is also easier to lie over the TCP transport. So only trust UDP.
- if (!UDPTransport.STYLE.equalsIgnoreCase(addr.getTransportStyle()))
- return false;
-
- if ("false".equalsIgnoreCase(_context.getProperty(Router.PROP_DYNAMIC_KEYS, "false")))
- return false; // no one cares. pretend it didn't change
-
- if (_log.shouldLog(Log.WARN))
- _log.warn("Rekeying and restarting due to " + addr.getTransportStyle()
- + " address update. new address: " + addr);
- if (rebootRouter) {
- _context.router().rebuildNewIdentity();
- } else {
- _context.router().killKeys();
- }
- return true;
- }
-
/**
* True if the router has tried to communicate with another router who is running a higher
* incompatible protocol version.
@@ -459,6 +412,14 @@ public class Router {
*/
public void rebuildNewIdentity() {
killKeys();
+ try {
+ for (Iterator iter = _shutdownTasks.iterator(); iter.hasNext(); ) {
+ Runnable task = (Runnable)iter.next();
+ task.run();
+ }
+ } catch (Throwable t) {
+ _log.log(Log.CRIT, "Error running shutdown task", t);
+ }
// hard and ugly
finalShutdown(EXIT_HARD_RESTART);
}
@@ -870,6 +831,9 @@ public class Router {
public void finalShutdown(int exitCode) {
_log.log(Log.CRIT, "Shutdown(" + exitCode + ") complete", new Exception("Shutdown"));
try { _context.logManager().shutdown(); } catch (Throwable t) { }
+ if ("true".equalsIgnoreCase(_context.getProperty(PROP_DYNAMIC_KEYS, "false")))
+ killKeys();
+
File f = new File(getPingFile());
f.delete();
if (_killVMOnEnd) {
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 819923349..04310a4b7 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
*
*/
public class RouterVersion {
- public final static String ID = "$Revision: 1.301 $ $Date: 2005/11/26 11:51:19 $";
+ public final static String ID = "$Revision: 1.302 $ $Date: 2005/11/26 13:26:23 $";
public final static String VERSION = "0.6.1.6";
- public final static long BUILD = 0;
+ public final static long BUILD = 1;
public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
System.out.println("Router ID: " + RouterVersion.ID);
diff --git a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java
index e10a237b5..0374922af 100644
--- a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java
+++ b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java
@@ -11,8 +11,6 @@ package net.i2p.router.startup;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
-import java.util.Collection;
-import java.util.Set;
import net.i2p.data.DataFormatException;
import net.i2p.data.PrivateKey;
@@ -78,7 +76,6 @@ public class LoadRouterInfoJob extends JobImpl {
fis1 = new FileInputStream(rif);
info = new RouterInfo();
info.readBytes(fis1);
- getContext().router().updateExternalAddress(info.getAddresses(), false);
_log.debug("Reading in routerInfo from " + rif.getAbsolutePath() + " and it has " + info.getAddresses().size() + " addresses");
}
diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
index 4434a0fef..567b0d35b 100644
--- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
@@ -763,7 +763,8 @@ public class EstablishmentManager {
Hash peer = outboundState.getRemoteIdentity().calculateHash();
_context.shitlist().shitlistRouter(peer, err);
- _context.profileManager().commErrorOccurred(peer);
+ _transport.dropPeer(peer);
+ //_context.profileManager().commErrorOccurred(peer);
} else {
while (true) {
OutNetMessage msg = outboundState.getNextQueuedMessage();
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java
index ec9841f4a..9a248620f 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -418,6 +418,11 @@ public class PeerState {
}
return _consecutiveFailedSends;
}
+ public long getInactivityTime() {
+ long now = _context.clock().now();
+ long lastActivity = Math.max(_lastReceiveTime, _lastSendFullyTime);
+ return now - lastActivity;
+ }
/** how fast we are sending *ack* packets */
public int getSendACKBps() { return _sendACKBps; }
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index 723e32191..95cf752e8 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -23,6 +23,7 @@ import net.i2p.data.i2np.DatabaseStoreMessage;
import net.i2p.router.CommSystemFacade;
import net.i2p.router.OutNetMessage;
import net.i2p.router.RouterContext;
+import net.i2p.router.Router;
import net.i2p.router.transport.Transport;
import net.i2p.router.transport.TransportImpl;
import net.i2p.router.transport.TransportBid;
@@ -526,8 +527,10 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
return super.getCurrentAddress();
}
- private void dropPeer(PeerState peer) {
- dropPeer(peer, true);
+ void dropPeer(Hash peer) {
+ PeerState state = getPeerState(peer);
+ if (state != null)
+ dropPeer(state, false);
}
private void dropPeer(PeerState peer, boolean shouldShitlist) {
if (_log.shouldLog(Log.INFO)) {
@@ -827,15 +830,26 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
protected void replaceAddress(RouterAddress address, RouterAddress oldAddress) {
replaceAddress(address);
if (oldAddress != null) {
- // fire a router.updateExternalAddress only if the address /really/ changed.
- // updating the introducers doesn't require a real change, only updating the
- // IP or port does.
UDPAddress old = new UDPAddress(oldAddress);
InetAddress oldHost = old.getHostAddress();
UDPAddress newAddr = new UDPAddress(address);
InetAddress newHost = newAddr.getHostAddress();
- if ( (old.getPort() != newAddr.getPort()) || (!oldHost.equals(newHost)) )
- _context.router().updateExternalAddress(address, true);
+ if ( (old.getPort() > 0) && (oldHost != null) && (isValid(oldHost.getAddress())) &&
+ (newAddr.getPort() > 0) && (newHost != null) && (isValid(newHost.getAddress())) ) {
+ if ( (old.getPort() != newAddr.getPort()) || (!oldHost.equals(newHost)) ) {
+ // substantial data has changed, so if we are in 'dynamic keys' mode, restart the
+ // router hard and regenerate a new identity
+ if ("true".equalsIgnoreCase(_context.getProperty(Router.PROP_DYNAMIC_KEYS, "false"))) {
+ if (_log.shouldLog(Log.ERROR))
+ _log.error("SSU address updated. new address: "
+ + newAddr.getHostAddress() + ":" + newAddr.getPort() + ", old address: "
+ + old.getHostAddress() + ":" + old.getPort());
+ // shutdown itself checks the DYNAMIC_KEYS flag, and if its set to true, deletes
+ // the keys
+ _context.router().shutdown(Router.EXIT_HARD_RESTART);
+ }
+ }
+ }
}
}
@@ -859,6 +873,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
else
return "";
}
+
+ private static final int DROP_INACTIVITY_TIME = 10*1000;
public void failed(OutboundMessageState msg) {
if (msg == null) return;
@@ -875,7 +891,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
consecutive = msg.getPeer().incrementConsecutiveFailedSends();
if (_log.shouldLog(Log.WARN))
_log.warn("Consecutive failure #" + consecutive + " sending to " + msg.getPeer());
- if (consecutive > MAX_CONSECUTIVE_FAILED)
+ if ( (consecutive > MAX_CONSECUTIVE_FAILED) && (msg.getPeer().getInactivityTime() > DROP_INACTIVITY_TIME))
dropPeer(msg.getPeer(), false);
}
failed(msg.getMessage());
|