From 2f69d168286ad7617e1a05bc928eb169f49f31ef Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 23 Oct 2012 19:34:35 +0000 Subject: [PATCH] - Thread magnet start if not connected - Don't lose all DHT peers if we stop quickly - Explore a kbucket if it's less than 3/4 full - Change release torrent file names --- apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java | 3 ++- apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java | 2 +- apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java | 4 +++- apps/i2psnark/java/src/org/klomp/snark/dht/PersistDHT.java | 7 +++++-- build.xml | 4 ++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java b/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java index 72ca6e574..c242ab9b7 100644 --- a/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java +++ b/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java @@ -518,6 +518,7 @@ public class KBucketSet { /** * For every bucket that hasn't been updated in this long, + * or isn't close to full, * generate a random key that would be a member of that bucket. * The returned keys may be searched for to "refresh" the buckets. * @return non-null, closest first @@ -528,7 +529,7 @@ public class KBucketSet { getReadLock(); try { for (KBucket b : _buckets) { - if (b.getLastChanged() < old) + if (b.getLastChanged() < old || b.getKeyCount() < BUCKET_SIZE * 3 / 4) rv.add(generateRandomKey(b)); } } finally { releaseReadLock(); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 6cd12be4c..eef6679ce 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -959,7 +959,7 @@ public class SnarkManager implements CompleteListener { _snarks.put(name, torrent); } if (autoStart) { - torrent.startTorrent(); + startTorrent(ih); addMessage(_("Fetching {0}", name)); DHT dht = _util.getDHT(); boolean shouldWarn = _util.connected() && diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java index 6dd9572d6..01a63a259 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java @@ -572,7 +572,9 @@ public class KRPC implements I2PSessionMuxedListener, DHT { _session.removeListener(I2PSession.PROTO_DATAGRAM_RAW, _rPort); // clear the DHT and tracker _tracker.stop(); - PersistDHT.saveDHT(_knownNodes, _dhtFile); + // don't lose all our peers if we didn't have time to check them + boolean saveAll = _context.clock().now() - _started < 20*60*1000; + PersistDHT.saveDHT(_knownNodes, saveAll, _dhtFile); _knownNodes.stop(); for (Iterator iter = _sentQueries.values().iterator(); iter.hasNext(); ) { ReplyWaiter waiter = iter.next(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/PersistDHT.java b/apps/i2psnark/java/src/org/klomp/snark/dht/PersistDHT.java index f474e1dd0..7ad643d91 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/PersistDHT.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/PersistDHT.java @@ -56,12 +56,15 @@ abstract class PersistDHT { log.info("Loaded " + count + " nodes from " + file); } - public static synchronized void saveDHT(DHTNodes nodes, File file) { + /** + * @param saveAll if true, don't check last seen time + */ + public static synchronized void saveDHT(DHTNodes nodes, boolean saveAll, File file) { if (nodes.size() <= 0) return; Log log = I2PAppContext.getGlobalContext().logManager().getLog(PersistDHT.class); int count = 0; - long maxAge = I2PAppContext.getGlobalContext().clock().now() - MAX_AGE; + long maxAge = saveAll ? 0 : I2PAppContext.getGlobalContext().clock().now() - MAX_AGE; PrintWriter out = null; try { out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "ISO-8859-1"))); diff --git a/build.xml b/build.xml index be60da692..82291712b 100644 --- a/build.xml +++ b/build.xml @@ -1554,7 +1554,7 @@ - + @@ -1562,7 +1562,7 @@ - +