From 0f8611e4659a54fd98bae56fe78a75df1273e091 Mon Sep 17 00:00:00 2001 From: jrandom Date: Fri, 30 Dec 2005 23:33:52 +0000 Subject: [PATCH] 2005-12-30 jrandom * Close streams more gracefully --- apps/i2psnark/java/src/org/klomp/snark/BitField.java | 3 ++- .../java/src/org/klomp/snark/PeerConnectionIn.java | 2 +- .../java/src/org/klomp/snark/PeerCoordinator.java | 12 ++++++++++-- apps/i2psnark/java/src/org/klomp/snark/Piece.java | 4 ++++ apps/i2psnark/java/src/org/klomp/snark/Snark.java | 7 +++++-- .../src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java | 4 ++-- .../src/net/i2p/client/streaming/Connection.java | 11 +++++++++-- .../i2p/client/streaming/ConnectionDataReceiver.java | 6 +++--- .../client/streaming/ConnectionPacketHandler.java | 9 +++++++-- core/java/src/net/i2p/util/EepGet.java | 10 +++------- history.txt | 5 ++++- router/java/src/net/i2p/router/RouterVersion.java | 4 ++-- 12 files changed, 52 insertions(+), 25 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/BitField.java b/apps/i2psnark/java/src/org/klomp/snark/BitField.java index 2e3f8d1a76..c87973c345 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/BitField.java +++ b/apps/i2psnark/java/src/org/klomp/snark/BitField.java @@ -117,7 +117,8 @@ public class BitField public String toString() { // Not very efficient - StringBuffer sb = new StringBuffer("BitField["); + StringBuffer sb = new StringBuffer("BitField("); + sb.append(size).append(")["); for (int i = 0; i < size; i++) if (get(i)) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java index a99edd79c2..0c63b4cf76 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java @@ -116,7 +116,7 @@ class PeerConnectionIn implements Runnable din.readFully(bitmap); ps.bitfieldMessage(bitmap); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received bitmap from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received bitmap from " + peer + " on " + peer.metainfo.getName() + ": size=" + (i-1) + ": " + ps.bitfield); break; case 6: piece = din.readInt(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 91d99cb0b2..4ab21b14b0 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -365,8 +365,11 @@ public class PeerCoordinator implements PeerListener */ public int wantPiece(Peer peer, BitField havePieces) { - if (halted) + if (halted) { + if (_log.shouldLog(Log.WARN)) + _log.warn("We don't want anything from the peer, as we are halted! peer=" + peer); return -1; + } synchronized(wantedPieces) { @@ -398,7 +401,12 @@ public class PeerCoordinator implements PeerListener piece = p; } } - if (piece == null) return -1; //If we still can't find a piece we want, so be it. + if (piece == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("nothing to even rerequest from " + peer + ": requested = " + requested + + " wanted = " + wantedPieces + " peerHas = " + havePieces); + return -1; //If we still can't find a piece we want, so be it. + } } piece.setRequested(true); return piece.getId(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java index 6e3cb2344c..4d6f693c95 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java @@ -35,4 +35,8 @@ public class Piece implements Comparable { public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); } public boolean isRequested() { return this.requested; } public void setRequested(boolean requested) { this.requested = requested; } + + public String toString() { + return String.valueOf(id); + } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index 2e3d304f6d..6ee711ecda 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -26,6 +26,7 @@ import java.util.*; import org.klomp.snark.bencode.*; +import net.i2p.data.Destination; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.util.I2PThread; @@ -287,8 +288,10 @@ public class Snark I2PServerSocket serversocket = I2PSnarkUtil.instance().getServerSocket(); if (serversocket == null) fatal("Unable to listen for I2P connections"); - else - debug("Listening on I2P destination " + serversocket.getManager().getSession().getMyDestination().toBase64(), NOTICE); + else { + Destination d = serversocket.getManager().getSession().getMyDestination(); + debug("Listening on I2P destination " + d.toBase64() + " / " + d.calculateHash().toBase64(), NOTICE); + } // Figure out what the torrent argument represents. meta = null; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java index 094145f666..abeddc5657 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java @@ -107,7 +107,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { useGZIP = true; if (allowGZIP && useGZIP) { - I2PThread req = new I2PThread(new CompressedRequestor(s, socket, modifiedHeader), "http compressor"); + I2PThread req = new I2PThread(new CompressedRequestor(s, socket, modifiedHeader), Thread.currentThread().getName()+".hc"); req.start(); } else { new I2PTunnelRunner(s, socket, slock, null, modifiedHeader.getBytes(), null); @@ -154,7 +154,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { _log.info("request headers: " + _headers); serverout.write(_headers.getBytes()); browserin = _browser.getInputStream(); - I2PThread sender = new I2PThread(new Sender(serverout, browserin, "server: browser to server"), "http compressed sender"); + I2PThread sender = new I2PThread(new Sender(serverout, browserin, "server: browser to server"), Thread.currentThread().getName() + "hcs"); sender.start(); browserout = _browser.getOutputStream(); diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java index 469a115e3a..87a0ef10e0 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java @@ -211,14 +211,20 @@ public class Connection { if (evt != null) { boolean sent = evt.retransmit(false); if (sent) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Retransmitting " + packet + " as an ack"); return; } else { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Not retransmitting " + packet + " as an ack"); //SimpleTimer.getInstance().addEvent(evt, evt.getNextSendTime()); } } } // if we don't have anything to retransmit, send a small ack packet = _receiver.send(null, 0, 0); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("sending new ack: " + packet); //packet.releasePayload(); } @@ -286,6 +292,8 @@ public class Connection { if (packet.isFlagSet(Packet.FLAG_CLOSE) || (remaining < 2)) { packet.setOptionalDelay(0); packet.setFlag(Packet.FLAG_DELAY_REQUESTED); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Requesting no ack delay for packet " + packet); } else { int delay = _options.getRTO() / 2; packet.setOptionalDelay(delay); @@ -1031,10 +1039,9 @@ public class Connection { + newWindowSize + " lifetime " + (_context.clock().now() - _packet.getCreatedOn()) + "ms)"); _outboundQueue.enqueue(_packet); + _lastSendTime = _context.clock().now(); } - _lastSendTime = _context.clock().now(); - // acked during resending (... or somethin') if ( (_packet.getAckTime() > 0) && (_packet.getNumSends() > 1) ) { _activeResends--; diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionDataReceiver.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionDataReceiver.java index d5f278de01..1bacea50f6 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionDataReceiver.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionDataReceiver.java @@ -184,8 +184,8 @@ class ConnectionDataReceiver implements MessageOutputStream.DataReceiver { if (_log.shouldLog(Log.DEBUG)) _log.debug("Closed is set for a new packet on " + con + ": " + packet); } else { - //if (_log.shouldLog(Log.DEBUG)) - // _log.debug("Closed is not set for a new packet on " + _connection + ": " + packet); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Closed is not set for a new packet on " + _connection + ": " + packet); } return packet; } @@ -202,6 +202,6 @@ class ConnectionDataReceiver implements MessageOutputStream.DataReceiver { } void destroy() { - _connection = null; + //_connection = null; } } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java index c870bbeacd..61c01e15d5 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java @@ -183,10 +183,14 @@ public class ConnectionPacketHandler { // we've already scheduled an ack above, so there is no need to schedule // a fast ack (we can wait a few ms) } else { - if (con.getLastSendTime() + 2000 < _context.clock().now()) { + long timeSinceSend = _context.clock().now() - con.getLastSendTime(); + if (timeSinceSend >= 2000) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Fast ack for dup " + packet); con.ackImmediately(); + } else { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Not fast acking dup " + packet + " since we last sent " + timeSinceSend + "ms ago"); } } } @@ -440,7 +444,8 @@ public class ConnectionPacketHandler { } public void timeReached() { if (_con.getLastSendTime() <= _created) { - if (!_con.getIsConnected()) return; + if (_con.getResetReceived() || _con.getResetSent() || (_con.getUnackedPacketsReceived() <= 0) ) + return; if (_log.shouldLog(Log.DEBUG)) _log.debug("Last sent was a while ago, and we want to ack a dup"); diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java index aa1f027091..ff30e0d4ae 100644 --- a/core/java/src/net/i2p/util/EepGet.java +++ b/core/java/src/net/i2p/util/EepGet.java @@ -610,7 +610,7 @@ public class EepGet { _log.debug("Request flushed"); } - private String getRequest() { + private String getRequest() throws IOException { StringBuffer buf = new StringBuffer(512); boolean post = false; if ( (_postData != null) && (_postData.length() > 0) ) @@ -620,12 +620,8 @@ public class EepGet { } else { buf.append("GET ").append(_url).append(" HTTP/1.1\r\n"); } - try { - URL url = new URL(_url); - buf.append("Host: ").append(url.getHost()).append("\r\n"); - } catch (MalformedURLException mue) { - mue.printStackTrace(); - } + URL url = new URL(_url); + buf.append("Host: ").append(url.getHost()).append("\r\n"); if (_alreadyTransferred > 0) { buf.append("Range: bytes="); buf.append(_alreadyTransferred); diff --git a/history.txt b/history.txt index 74aa22c2c0..9302282f3b 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,7 @@ -$Id: history.txt,v 1.373 2005/12/30 13:16:46 jrandom Exp $ +$Id: history.txt,v 1.374 2005/12/30 15:57:53 jrandom Exp $ + +2005-12-30 jrandom + * Close streams more gracefully 2005-12-30 jrandom * Small streaming lib bugfixes for the modified timeouts diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index a316f02630..7a2cae6b03 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.320 $ $Date: 2005/12/29 08:07:24 $"; + public final static String ID = "$Revision: 1.321 $ $Date: 2005/12/30 15:57:53 $"; public final static String VERSION = "0.6.1.8"; - public final static long BUILD = 4; + public final static long BUILD = 5; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);