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 @@ - +