From f22601b47761da6050a9de08902c38f7687f08df Mon Sep 17 00:00:00 2001 From: jrandom Date: Thu, 26 Jan 2006 04:28:15 +0000 Subject: [PATCH] 2006-01-25 jrandom * Run the peer profile coalescing/reorganization outside the job queue (on one of the timers), to cut down on some job queue congestion. Also, trim old profiles while running, not just when starting up. * Slightly more sane intra-floodfill-node netDb activity (only flood new entries) * Workaround in the I2PTunnelHTTPServer for some bad requests (though the source of the bug is not yet addressed) * Better I2PSnark reconnection handling * Further cleanup in the new tunnel build process * Make sure we expire old participants properly * Remove much of the transient overload throttling (it wasn't using a good metric) --- .../src/org/klomp/snark/ConnectionAcceptor.java | 15 +++++++-------- .../java/src/org/klomp/snark/I2PSnarkUtil.java | 6 +++++- .../net/i2p/i2ptunnel/I2PTunnelHTTPServer.java | 16 ++++++++++++++++ apps/syndie/java/src/net/i2p/syndie/User.java | 4 +++- core/java/src/net/i2p/stat/Rate.java | 2 +- history.txt | 16 +++++++++++++++- 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java index 130e10133..5767abc56 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java @@ -113,10 +113,10 @@ public class ConnectionAcceptor implements Runnable // ok, already updated socketChanged = false; } - if (serverSocket == null) { - Snark.debug("Server socket went away.. boo hiss", Snark.ERROR); - stop = true; - return; + while ( (serverSocket == null) && (!stop)) { + serverSocket = I2PSnarkUtil.instance().getServerSocket(); + if (serverSocket == null) + try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} } try { @@ -128,9 +128,7 @@ public class ConnectionAcceptor implements Runnable I2PServerSocket ss = I2PSnarkUtil.instance().getServerSocket(); if (ss != serverSocket) { serverSocket = ss; - } else { - Snark.debug("Null socket accepted, but socket wasn't changed?", Snark.ERROR); - try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} + socketChanged = true; } } } else { @@ -154,7 +152,8 @@ public class ConnectionAcceptor implements Runnable try { - serverSocket.close(); + if (serverSocket != null) + serverSocket.close(); } catch (I2PException ignored) { } diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index dc055bdbc..f576794e0 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -152,7 +152,11 @@ public class I2PSnarkUtil { } public I2PServerSocket getServerSocket() { - return _manager.getServerSocket(); + I2PSocketManager mgr = _manager; + if (mgr != null) + return mgr.getServerSocket(); + else + return null; } String getOurIPString() { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java index b3c84442e..c653a3285 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java @@ -38,18 +38,21 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { super(host, port, privData, l, notifyThis, tunnel); _spoofHost = spoofHost; getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpserver.blockingHandleTime", "how long the blocking handle takes to complete", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000, 3*60*60*1000 }); + getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpNullWorkaround", "How often an http server works around a streaming lib or i2ptunnel bug", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000 }); } public I2PTunnelHTTPServer(InetAddress host, int port, File privkey, String privkeyname, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) { super(host, port, privkey, privkeyname, l, notifyThis, tunnel); _spoofHost = spoofHost; getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpserver.blockingHandleTime", "how long the blocking handle takes to complete", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000, 3*60*60*1000 }); + getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpNullWorkaround", "How often an http server works around a streaming lib or i2ptunnel bug", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000 }); } public I2PTunnelHTTPServer(InetAddress host, int port, InputStream privData, String privkeyname, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) { super(host, port, privData, privkeyname, l, notifyThis, tunnel); _spoofHost = spoofHost; getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpserver.blockingHandleTime", "how long the blocking handle takes to complete", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000, 3*60*60*1000 }); + getTunnel().getContext().statManager().createRateStat("i2ptunnel.httpNullWorkaround", "How often an http server works around a streaming lib or i2ptunnel bug", "I2PTunnel.HTTPServer", new long[] { 60*1000, 10*60*1000 }); } /** @@ -291,6 +294,19 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { if (_log.shouldLog(Log.DEBUG)) _log.debug("Read the http command [" + command.toString() + "]"); + int trimmed = 0; + if (command.length() > 0) { + for (int i = 0; i < command.length(); i++) { + if (command.charAt(i) == 0) { + command = command.deleteCharAt(i); + i--; + trimmed++; + } + } + } + if (trimmed > 0) + getTunnel().getContext().statManager().addRateData("i2ptunnel.httpNullWorkaround", trimmed, 0); + while (true) { buf.setLength(0); ok = DataHelper.readLine(in, buf); diff --git a/apps/syndie/java/src/net/i2p/syndie/User.java b/apps/syndie/java/src/net/i2p/syndie/User.java index 5d1f50ead..8b63d65cd 100644 --- a/apps/syndie/java/src/net/i2p/syndie/User.java +++ b/apps/syndie/java/src/net/i2p/syndie/User.java @@ -115,7 +115,9 @@ public class User { for (Iterator iter = _petnames.getNames().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); PetName pn = _petnames.getByName(name); - if (AddressesServlet.PROTO_TAG.equals(pn.getProtocol())) + if (pn == null) continue; + String proto = pn.getProtocol(); + if ( (proto != null) && (AddressesServlet.PROTO_TAG.equals(proto)) ) rv.add(pn.getLocation()); } if (rv.size() <= 0) { diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java index 973a9cdf6..adf7c57eb 100644 --- a/core/java/src/net/i2p/stat/Rate.java +++ b/core/java/src/net/i2p/stat/Rate.java @@ -176,8 +176,8 @@ public class Rate { } public void coalesce() { + long now = now(); synchronized (_lock) { - long now = now(); long measuredPeriod = now - _lastCoalesceDate; if (measuredPeriod < _period) { // no need to coalesce diff --git a/history.txt b/history.txt index 18077755c..5c777d866 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,18 @@ -$Id: history.txt,v 1.394 2006/01/22 19:51:57 jrandom Exp $ +$Id: history.txt,v 1.395 2006/01/25 10:34:28 dust Exp $ + +2006-01-25 jrandom + * Run the peer profile coalescing/reorganization outside the job queue + (on one of the timers), to cut down on some job queue congestion. Also, + trim old profiles while running, not just when starting up. + * Slightly more sane intra-floodfill-node netDb activity (only flood new + entries) + * Workaround in the I2PTunnelHTTPServer for some bad requests (though the + source of the bug is not yet addressed) + * Better I2PSnark reconnection handling + * Further cleanup in the new tunnel build process + * Make sure we expire old participants properly + * Remove much of the transient overload throttling (it wasn't using a good + metric) 2006-01-25 dust * Fix IRC client proxy to use ISO-8859-1.