From 6670209cb3061c1f81337283e72876a94274f3a4 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 10 Jan 2011 17:14:34 +0000 Subject: [PATCH] i2psnark: - Update session options when max bandwidth changes - BufferedStream cleanup and comments - torrent name display tweak - findbugs --- .../org/klomp/snark/ConnectionAcceptor.java | 7 ++----- .../src/org/klomp/snark/I2PSnarkUtil.java | 19 ++++++++++++++++++- .../java/src/org/klomp/snark/MetaInfo.java | 4 ++-- .../java/src/org/klomp/snark/Peer.java | 18 +++--------------- .../src/org/klomp/snark/PeerCheckerTask.java | 1 + .../src/org/klomp/snark/PeerCoordinator.java | 2 +- .../java/src/org/klomp/snark/Piece.java | 2 +- .../java/src/org/klomp/snark/Snark.java | 6 +++--- .../src/org/klomp/snark/SnarkManager.java | 11 ++++++----- .../java/src/org/klomp/snark/Storage.java | 5 +++-- .../org/klomp/snark/web/I2PSnarkServlet.java | 16 ++++++++-------- 11 files changed, 48 insertions(+), 43 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java index 34fa5054ea..b4ba0f2996 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java @@ -179,11 +179,8 @@ public class ConnectionAcceptor implements Runnable try { InputStream in = _socket.getInputStream(); OutputStream out = _socket.getOutputStream(); - - if (true) { - in = new BufferedInputStream(in); - //out = new BufferedOutputStream(out); - } + // this is for the readahead in PeerAcceptor.connection() + in = new BufferedInputStream(in); if (_log.shouldLog(Log.DEBUG)) _log.debug("Handling socket from " + _socket.getPeerDestination().calculateHash().toBase64()); peeracceptor.connection(_socket, in, out); diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index 89f5087b15..8fd7745678 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -71,6 +71,7 @@ public class I2PSnarkUtil { public static final String DEFAULT_OPENTRACKERS = "http://tracker.welterde.i2p/a"; public static final int DEFAULT_MAX_UP_BW = 8; //KBps public static final int MAX_CONNECTIONS = 16; // per torrent + private static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond"; private static final boolean ENABLE_DHT = true; public I2PSnarkUtil(I2PAppContext ctx) { @@ -132,9 +133,21 @@ public class I2PSnarkUtil { _configured = true; } + /** + * @param KBps + */ public void setMaxUpBW(int limit) { _maxUpBW = limit; + _opts.put(PROP_MAX_BW, Integer.toString(limit * (1024 * 6 / 5))); // add a little for overhead _configured = true; + if (_manager != null) { + I2PSession sess = _manager.getSession(); + if (sess != null) { + Properties newProps = new Properties(); + newProps.putAll(_opts); + sess.updateOptions(newProps); + } + } } public void setMaxConnections(int limit) { @@ -154,6 +167,10 @@ public class I2PSnarkUtil { public int getEepProxyPort() { return _proxyPort; } public boolean getEepProxySet() { return _shouldProxy; } public int getMaxUploaders() { return _maxUploaders; } + + /** + * @return KBps + */ public int getMaxUpBW() { return _maxUpBW; } public int getMaxConnections() { return _maxConnections; } public int getStartupDelay() { return _startupDelay; } @@ -166,7 +183,7 @@ public class I2PSnarkUtil { // try to find why reconnecting after stop if (_log.shouldLog(Log.DEBUG)) _log.debug("Connecting to I2P", new Exception("I did it")); - Properties opts = new Properties(); + Properties opts = _context.getProperties(); if (_opts != null) { for (Iterator iter = _opts.keySet().iterator(); iter.hasNext(); ) { String key = (String)iter.next(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java index d6a113ce61..3e13c7a421 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java @@ -189,7 +189,7 @@ public class MetaInfo if (val == null) throw new InvalidBEncodingException("Missing length number"); long len = val.getLong(); - m_lengths.add(new Long(len)); + m_lengths.add(Long.valueOf(len)); l += len; val = (BEValue)desc.get("path"); @@ -438,7 +438,7 @@ public class MetaInfo info.put("piece length", Integer.valueOf(piece_length)); info.put("pieces", piece_hashes); if (files == null) - info.put("length", new Long(length)); + info.put("length", Long.valueOf(length)); else { List l = new ArrayList(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index bda2c28fd6..5a003cac23 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -20,7 +20,6 @@ package org.klomp.snark; -import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -231,19 +230,8 @@ public class Peer implements Comparable throw new IOException("Unable to reach " + peerID); } InputStream in = sock.getInputStream(); - OutputStream out = sock.getOutputStream(); //new BufferedOutputStream(sock.getOutputStream()); - if (true) { - // buffered output streams are internally synchronized, so we can't get through to the underlying - // I2PSocket's MessageOutputStream to close() it if we are blocking on a write(...). Oh, and the - // buffer is unnecessary anyway, as unbuffered access lets the streaming lib do the 'right thing'. - //out = new BufferedOutputStream(out); - in = new BufferedInputStream(sock.getInputStream()); - } - //BufferedInputStream bis - // = new BufferedInputStream(sock.getInputStream()); - //BufferedOutputStream bos - // = new BufferedOutputStream(sock.getOutputStream()); - byte [] id = handshake(in, out); //handshake(bis, bos); + OutputStream out = sock.getOutputStream(); + byte [] id = handshake(in, out); byte [] expected_id = peerID.getID(); if (expected_id == null) { peerID.setID(id); @@ -328,7 +316,7 @@ public class Peer implements Comparable * Sets DataIn/OutputStreams, does the handshake and returns the id * reported by the other side. */ - private byte[] handshake(InputStream in, OutputStream out) //BufferedInputStream bis, BufferedOutputStream bos) + private byte[] handshake(InputStream in, OutputStream out) throws IOException { din = new DataInputStream(in); diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index 6370eaca64..b767f875a7 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java @@ -210,6 +210,7 @@ class PeerCheckerTask extends TimerTask if (_util.getDHT() != null && (_runCount % 5) == 0) { _util.getDHT().announce(coordinator.getInfoHash(), peer.getPeerID().getDestHash()); } + // send PEX } // Resync actual uploaders value diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index d01f1ef2e8..5e75f17643 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -1185,7 +1185,7 @@ public class PeerCoordinator implements PeerListener * @since 0.8.4 */ public void gotPeers(Peer peer, List<PeerID> peers) { - + // spin off thread or timer task to do a new Peer() and an addPeer() for each one } /** Return number of allowed uploaders for this torrent. diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java index 6855d36a0e..dd48508a9a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java @@ -35,8 +35,8 @@ class Piece implements Comparable { @Override public boolean equals(Object o) { + if (o == null) return false; if (o instanceof Piece) { - if (o == null) return false; return this.id == ((Piece)o).id; } return false; diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index e3a99bdc9b..98bcd4eed4 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -108,7 +108,7 @@ public class Snark } catch (Throwable t) { System.out.println("OOM in the OOM"); } - System.exit(0); + //System.exit(0); } } @@ -980,7 +980,6 @@ public class Snark (" <file> \tEither a local .torrent metainfo file to download"); System.out.println (" \tor (with --share) a file to share."); - System.exit(-1); } /** @@ -1117,11 +1116,12 @@ public class Snark coordinator.setWantedPieces(); } + /** SnarkSnutdown callback unused */ public void shutdown() { // Should not be necessary since all non-deamon threads should // have died. But in reality this does not always happen. - System.exit(0); + //System.exit(0); } public interface CompleteListener { diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 6ac7261e3e..026363f6f2 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -247,11 +247,9 @@ public class SnarkManager implements Snark.CompleteListener { i2cpOpts.put(pair.substring(0, split), pair.substring(split+1)); } } - if (i2cpHost != null) { - _util.setI2CPConfig(i2cpHost, i2cpPort, i2cpOpts); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Configuring with I2CP options " + i2cpOpts); - } + _util.setI2CPConfig(i2cpHost, i2cpPort, i2cpOpts); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Configuring with I2CP options " + i2cpOpts); //I2PSnarkUtil.instance().setI2CPConfig("66.111.51.110", 7654, new Properties()); //String eepHost = _config.getProperty(PROP_EEP_HOST); //int eepPort = getInt(PROP_EEP_PORT, 4444); @@ -338,6 +336,7 @@ public class SnarkManager implements Snark.CompleteListener { } } + // FIXME do this even if == null if (i2cpHost != null) { int oldI2CPPort = _util.getI2CPPort(); String oldI2CPHost = _util.getI2CPHost(); @@ -383,6 +382,7 @@ public class SnarkManager implements Snark.CompleteListener { Properties p = new Properties(); p.putAll(opts); _util.setI2CPConfig(i2cpHost, port, p); + _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents")); if (_log.shouldLog(Log.DEBUG)) _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts @@ -396,6 +396,7 @@ public class SnarkManager implements Snark.CompleteListener { p.putAll(opts); addMessage(_("I2CP settings changed to {0}", i2cpHost + ":" + port + " (" + i2cpOpts.trim() + ")")); _util.setI2CPConfig(i2cpHost, port, p); + _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); boolean ok = _util.connect(); if (!ok) { addMessage(_("Unable to connect with the new settings, reverting to the old I2CP settings")); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 77012de77d..23fba7f357 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -105,7 +105,7 @@ public class Storage { long length = lengths[i]; total += length; - lengthsList.add(new Long(length)); + lengthsList.add(Long.valueOf(length)); } piece_size = MIN_PIECE_SIZE; @@ -753,7 +753,8 @@ public class Storage openRAF(nr, false); // RW // XXX - Is this the best way to make sure we have enough space for // the whole file? - listener.storageCreateFile(this, names[nr], lengths[nr]); + if (listener != null) + listener.storageCreateFile(this, names[nr], lengths[nr]); final int ZEROBLOCKSIZE = metainfo.getPieceLength(0); byte[] zeros; try { diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 616df5b83a..c859c436cf 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -755,8 +755,12 @@ public class I2PSnarkServlet extends Default { filename = filename.substring(0, i); String fullFilename = filename; if (filename.length() > MAX_DISPLAYED_FILENAME_LENGTH) { - fullFilename = new String(filename); - filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "…"; + String start = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH); + if (start.indexOf(" ") < 0 && start.indexOf("-") < 0) { + // browser has nowhere to break it + fullFilename = filename; + filename = start + "…"; + } } long total = snark.getTotalLength(); // Early typecast, avoid possibly overflowing a temp integer @@ -1035,7 +1039,7 @@ public class I2PSnarkServlet extends Default { } else { pct = (float) 101.0; // until we get the metainfo we don't know how many pieces there are - out.write("??"); + //out.write("??"); } out.write("</td>\n\t"); out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">"); @@ -1134,7 +1138,6 @@ public class I2PSnarkServlet extends Default { } private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException { - String uri = req.getRequestURI(); String newURL = req.getParameter("newURL"); if ( (newURL == null) || (newURL.trim().length() <= 0) ) newURL = ""; @@ -1175,7 +1178,6 @@ public class I2PSnarkServlet extends Default { } private void writeSeedForm(PrintWriter out, HttpServletRequest req) throws IOException { - String uri = req.getRequestURI(); String baseFile = req.getParameter("baseFile"); if (baseFile == null || baseFile.trim().length() <= 0) baseFile = ""; @@ -1235,7 +1237,6 @@ public class I2PSnarkServlet extends Default { } private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException { - String uri = req.getRequestURI(); String dataDir = _manager.getDataDir().getAbsolutePath(); boolean autoStart = _manager.shouldAutoStart(); boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers(); @@ -1914,8 +1915,7 @@ private static class FetchAndAdd implements Runnable { return; } - // don't hold object from this MetaInfo - String name = new String(info.getName()); + String name = info.getName(); name = Storage.filterName(name); name = name + ".torrent"; File torrentFile = new File(_manager.getDataDir(), name); -- GitLab