diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java index 4a41d63e145c07776a00737d96be39da369787d8..8fe2f2142ce155a5fc2a4ad869833da510088683 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java @@ -26,6 +26,7 @@ import java.net.*; import net.i2p.I2PException; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocket; +import net.i2p.util.I2PThread; /** * Accepts connections on a TCP port and routes them to sub-acceptors. @@ -47,7 +48,7 @@ public class ConnectionAcceptor implements Runnable socketChanged = false; stop = false; - thread = new Thread(this, "I2PSnark acceptor"); + thread = new I2PThread(this, "I2PSnark acceptor"); thread.setDaemon(true); thread.start(); } @@ -105,7 +106,7 @@ public class ConnectionAcceptor implements Runnable Snark.debug("Null socket accepted, but socket wasn't changed?", Snark.ERROR); } } else { - Thread t = new Thread(new Handler(socket), "Connection-" + socket); + Thread t = new I2PThread(new Handler(socket), "Connection-" + socket); t.start(); } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index 339eec8dded7dbe8ffddca1a857b5319e05f1f07..e970a6954064089b59bd0aef25151f36404309b3 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -3,9 +3,8 @@ package org.klomp.snark; import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.util.EepGet; -import net.i2p.data.Base64; -import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; +import net.i2p.client.I2PSession; +import net.i2p.data.*; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; @@ -149,7 +148,13 @@ public class I2PSnarkUtil { } String getOurIPString() { - return _manager.getSession().getMyDestination().toBase64(); + I2PSession sess = _manager.getSession(); + if (sess != null) { + Destination dest = sess.getMyDestination(); + if (dest != null) + return dest.toBase64(); + } + return "unknown"; } Destination getDestination(String ip) { if (ip == null) return null; diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java index 817d98927a15062b01c468b1b21690486a933f68..b9388bda1701f89cfcf48dad90b1774e581c108f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java @@ -24,6 +24,7 @@ import java.io.*; import java.net.*; import java.util.*; +import net.i2p.util.I2PThread; import net.i2p.util.Log; class PeerConnectionOut implements Runnable @@ -48,7 +49,7 @@ class PeerConnectionOut implements Runnable _id = ++__id; quit = false; - thread = new Thread(this, "Snark sender " + _id); + thread = new I2PThread(this, "Snark sender " + _id); thread.start(); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 34da8c3edca927c008f42126a96d16713f88db31..84666d9f077b5061c5cecdcc141e8725f72ebd02 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -23,6 +23,7 @@ package org.klomp.snark; import java.util.*; import java.io.IOException; +import net.i2p.util.I2PThread; import net.i2p.util.Log; /** @@ -249,7 +250,7 @@ public class PeerCoordinator implements PeerListener } }; String threadName = peer.toString(); - new Thread(r, threadName).start(); + new I2PThread(r, threadName).start(); } else if (Snark.debug >= Snark.INFO) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 2661d1fa29b3a9782b531dafd282e1690c048d43..31508cc1b1b3e6cec0b8756b5e6b27384fdb9316 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -372,7 +372,11 @@ public class SnarkManager implements Snark.CompleteListener { while (true) { File dir = getDataDir(); _log.debug("Directory Monitor loop over " + dir.getAbsolutePath()); - monitorTorrents(dir); + try { + monitorTorrents(dir); + } catch (Exception e) { + _log.error("Error in the DirectoryMonitor", e); + } try { Thread.sleep(60*1000); } catch (InterruptedException ie) {} } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java index fe5bd32ad8550671a48e11aaac997b33b7e2e2b5..0caefb42cb7a96f0e16d6c4764e56506843978fc 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkShutdown.java @@ -22,10 +22,12 @@ package org.klomp.snark; import java.io.IOException; +import net.i2p.util.I2PThread; + /** * Makes sure everything ends correctly when shutting down. */ -public class SnarkShutdown extends Thread +public class SnarkShutdown extends I2PThread { private final Storage storage; private final PeerCoordinator coordinator; diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java index 7cd0e7406ff1d0c60c5705fa0f23e04504718adc..ab915f6fc3482fc5ec4c98ab1c645acc7fbebadc 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java +++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java @@ -25,6 +25,7 @@ import java.net.*; import java.util.*; import org.klomp.snark.bencode.*; +import net.i2p.util.I2PThread; import net.i2p.util.Log; /** @@ -33,7 +34,7 @@ import net.i2p.util.Log; * * @author Mark Wielaard (mark@klomp.org) */ -public class TrackerClient extends Thread +public class TrackerClient extends I2PThread { private static final Log _log = new Log(TrackerClient.class); private static final String NO_EVENT = ""; @@ -84,6 +85,16 @@ public class TrackerClient extends Thread this.interrupt(); } + private boolean verifyConnected() { + while (!stop && !I2PSnarkUtil.instance().connected()) { + boolean ok = I2PSnarkUtil.instance().connect(); + if (!ok) { + try { Thread.sleep(30*1000); } catch (InterruptedException ie) {} + } + } + return !stop && I2PSnarkUtil.instance().connected(); + } + public void run() { // XXX - Support other IPs @@ -102,6 +113,7 @@ public class TrackerClient extends Thread try { + if (!verifyConnected()) return; boolean started = false; while (!started) { @@ -164,6 +176,8 @@ public class TrackerClient extends Thread if (stop) break; + + if (!verifyConnected()) return; uploaded = coordinator.getUploaded(); downloaded = coordinator.getDownloaded(); @@ -224,6 +238,7 @@ public class TrackerClient extends Thread { try { + if (!verifyConnected()) return; TrackerInfo info = doRequest(announce, infoHash, peerID, uploaded, downloaded, left, STOPPED_EVENT); } diff --git a/history.txt b/history.txt index 131e57a48079c755182508aecc179627c0b751f5..755fb904c3d9b807a190812ed19e8f2b32cfbfdf 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,10 @@ -$Id: history.txt,v 1.358 2005/12/16 03:24:22 jrandom Exp $ +$Id: history.txt,v 1.359 2005/12/16 06:01:20 jrandom Exp $ + +2005-12-16 jrandom + * Moved I2PSnark from using Threads to I2PThreads, so we handle OOMs + properly (thanks Complication!) + * More guards in I2PSnark for zany behavior (I2PSession recon w/ skew, + b0rking in the DirMonitor, etc) 2005-12-16 jrandom * Try to run a torrent in readonly mode if we can't write to the file, and