diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java index e8e0a01f102212832cd5ba92f5fe17dc8cbf6476..b03ea1473415ae4fc3332a50e878bd2bef640877 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java @@ -8,7 +8,9 @@ package net.i2p.router.networkdb.kademlia; * */ +import java.util.HashSet; import java.util.List; +import java.util.Set; import net.i2p.data.Hash; import net.i2p.data.TunnelId; @@ -96,7 +98,13 @@ class ExploreJob extends SearchJob { available = MAX_CLOSEST - msg.getDontIncludePeers().size(); if (available > 0) { - List peers = _peerSelector.selectNearestExplicit(getState().getTarget(), available, msg.getDontIncludePeers(), getFacade().getKBuckets()); + // selectNearestExplicit adds our hash to the dontInclude set (3rd param) ... + // And we end up with MAX_CLOSEST+1 entries. + // We don't want our hash in the message's don't-include list though. + // We're just exploring, but this could give things away, and tie our exploratory tunnels to our router, + // so let's not put our hash in there. + Set dontInclude = new HashSet(msg.getDontIncludePeers()); + List peers = _peerSelector.selectNearestExplicit(getState().getTarget(), available, dontInclude, getFacade().getKBuckets()); msg.getDontIncludePeers().addAll(peers); } @@ -106,17 +114,6 @@ class ExploreJob extends SearchJob { return msg; } - - /** - * We're looking for a router, so lets build the lookup message (no need to tunnel route either, so just have - * replies sent back to us directly). This uses the similar overrides as the other buildMessage above. - * - */ - @Override - protected DatabaseLookupMessage buildMessage(long expiration) { - return buildMessage(null, getContext().router().getRouterInfo().getIdentity().getHash(), expiration); - } - /** max # of concurrent searches */ @Override protected int getBredth() { return EXPLORE_BREDTH; } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java index 049140397fc4127a8cbe7adc501a2475ea89f68e..d051460a29d349138b3d6862f2ac1ec49b6804e4 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java @@ -44,7 +44,7 @@ class FloodfillPeerSelector extends PeerSelector { public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets, boolean preferConnected) { if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); FloodfillSelectionCollector matches = new FloodfillSelectionCollector(key, peersToIgnore, maxNumRouters); if (kbuckets == null) return new ArrayList(); kbuckets.getAll(matches); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java index c88897a127031dcc818d5d5302ca5ef1e19cdaaa..acf533bf787325acc02bb71b2b55cc00b3e5f46a 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java @@ -61,7 +61,7 @@ public class PeerSelector { if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); Set allHashes = kbuckets.getAll(peersToIgnore); removeFailingPeers(allHashes); Map diffMap = new HashMap(allHashes.size()); @@ -94,7 +94,7 @@ public class PeerSelector { public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { // LINT -- Exporting non-public type through public API if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); MatchSelectionCollector matches = new MatchSelectionCollector(key, peersToIgnore); kbuckets.getAll(matches); List rv = matches.get(maxNumRouters); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index 6f89551e2f796a98ab9a28c15370fec22bbda622..282b67e0cdc0973045144633a4cac6a29ac17914 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -106,8 +106,10 @@ class PersistentDataStore extends TransientDataStore { */ @Override public DataStructure remove(Hash key, boolean persist) { - if (persist) + if (persist) { + _writer.remove(key); _context.jobQueue().addJob(new RemoveJob(key)); + } return super.remove(key); } @@ -183,6 +185,10 @@ class PersistentDataStore extends TransientDataStore { return _keys.get(key); } + public void remove(Hash key) { + _keys.remove(key); + } + public void run() { _quit = false; Hash key = null; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java index 161f2900128e32e9c6c92a9675535b2445a7ab95..d26ac1a5e4c2d3963692e84a9c69dc2669ec011b 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java @@ -452,6 +452,7 @@ class SearchJob extends JobImpl { } /** we're searching for a router, so we can just send direct */ +/******* always send through the lease protected void sendRouterSearch(RouterInfo router) { int timeout = _facade.getPeerTimeout(router.getIdentity().getHash()); long expiration = getContext().clock().now() + timeout; @@ -471,6 +472,7 @@ class SearchJob extends JobImpl { j.runJob(); //getContext().jobQueue().addJob(j); } +**********/ /** * what tunnel will we send the search out through? @@ -513,6 +515,7 @@ class SearchJob extends JobImpl { * replies sent back to us directly) * */ +/******* always send through the lease protected DatabaseLookupMessage buildMessage(long expiration) { DatabaseLookupMessage msg = new DatabaseLookupMessage(getContext(), true); msg.setSearchKey(_state.getTarget()); @@ -522,6 +525,7 @@ class SearchJob extends JobImpl { msg.setReplyTunnel(null); return msg; } +*********/ void replyFound(DatabaseSearchReplyMessage message, Hash peer) { long duration = _state.replyFound(peer);