diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java index ced2dd67f..e50d8a91a 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java @@ -101,6 +101,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna this.l = l; this.handlerName = handlerName + _clientId; + // no need to load the netDb with leaseSets for destinations that will never + // be looked up + tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true"); + while (sockMgr == null) { synchronized (sockLock) { if (ownDest) { diff --git a/router/java/src/net/i2p/router/ClientManagerFacade.java b/router/java/src/net/i2p/router/ClientManagerFacade.java index 32eec2429..6dd1c8e21 100644 --- a/router/java/src/net/i2p/router/ClientManagerFacade.java +++ b/router/java/src/net/i2p/router/ClientManagerFacade.java @@ -25,6 +25,7 @@ import net.i2p.data.i2cp.SessionConfig; * @author jrandom */ public abstract class ClientManagerFacade implements Service { + public static final String PROP_CLIENT_ONLY = "i2cp.dontPublishLeaseSet"; /** * Request that a particular client authorize the Leases contained in the @@ -71,6 +72,10 @@ public abstract class ClientManagerFacade implements Service { public abstract void messageReceived(ClientMessage msg); public boolean verifyClientLiveliness() { return true; } + /** + * Does the client specified want their leaseSet published? + */ + public boolean shouldPublishLeaseSet(Hash destinationHash) { return true; } /** diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 5bce0ed0a..cb64f05c2 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.220 $ $Date: 2005/08/27 17:15:38 $"; + public final static String ID = "$Revision: 1.221 $ $Date: 2005/08/29 20:59:13 $"; public final static String VERSION = "0.6.0.3"; - public final static long BUILD = 4; + public final static long BUILD = 5; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID); diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index 0f4e7ba8b..6a258994e 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -25,6 +25,7 @@ import net.i2p.data.TunnelId; import net.i2p.data.i2cp.MessageId; import net.i2p.data.i2cp.SessionConfig; import net.i2p.router.ClientMessage; +import net.i2p.router.ClientManagerFacade; import net.i2p.router.Job; import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; @@ -269,6 +270,16 @@ public class ClientManager { return false; } + public boolean shouldPublishLeaseSet(Hash destHash) { + if (destHash == null) return true; + ClientConnectionRunner runner = getRunner(destHash); + if (runner == null) return true; + String dontPublish = runner.getConfig().getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY); + if ( (dontPublish != null) && ("true".equals(dontPublish)) ) + return false; + return true; + } + public Set listClients() { Set rv = new HashSet(); synchronized (_runners) { diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java index 00a03255d..44df7d1a8 100644 --- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java +++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java @@ -164,6 +164,8 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade { return false; } } + + public boolean shouldPublishLeaseSet(Hash destinationHash) { return _manager.shouldPublishLeaseSet(destinationHash); } public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered) { if (_manager != null) diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java index e4b17e84b..d1d621083 100644 --- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java @@ -75,9 +75,11 @@ public class HandleDatabaseLookupMessageJob extends JobImpl { LeaseSet ls = getContext().netDb().lookupLeaseSetLocally(_message.getSearchKey()); if (ls != null) { + boolean publish = getContext().clientManager().shouldPublishLeaseSet(_message.getSearchKey()); + // only answer a request for a LeaseSet if it has been published // to us, or, if its local, if we would have published to ourselves - if (answerAllQueries() || ls.getReceivedAsPublished()) { + if (publish && (answerAllQueries() || ls.getReceivedAsPublished())) { getContext().statManager().addRateData("netDb.lookupsMatchedReceivedPublished", 1, 0); sendData(_message.getSearchKey(), ls, fromKey, _message.getReplyTunnel()); } else { @@ -85,7 +87,7 @@ public class HandleDatabaseLookupMessageJob extends JobImpl { CLOSENESS_THRESHOLD, _message.getDontIncludePeers()); if (getContext().clientManager().isLocal(ls.getDestination())) { - if (weAreClosest(routerInfoSet)) { + if (publish && weAreClosest(routerInfoSet)) { getContext().statManager().addRateData("netDb.lookupsMatchedLocalClosest", 1, 0); sendData(_message.getSearchKey(), ls, fromKey, _message.getReplyTunnel()); } else { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/DataPublisherJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/DataPublisherJob.java index 207bf6724..307ae5f79 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/DataPublisherJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/DataPublisherJob.java @@ -54,6 +54,8 @@ class DataPublisherJob extends JobImpl { _log.warn("Not publishing a lease that isn't current - " + key, new Exception("Publish expired lease?")); } + if (!getContext().clientManager().shouldPublishLeaseSet(key)) + continue; } _facade.sendStore(key, data, null, null, STORE_TIMEOUT, null); //StoreJob store = new StoreJob(getContext(), _facade, key, data, null, null, STORE_TIMEOUT); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/DataRepublishingSelectorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/DataRepublishingSelectorJob.java index f469317a0..173522ab0 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/DataRepublishingSelectorJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/DataRepublishingSelectorJob.java @@ -135,6 +135,8 @@ class DataRepublishingSelectorJob extends JobImpl { } else { LeaseSet ls = _facade.lookupLeaseSetLocally(key); if (ls != null) { + if (!getContext().clientManager().shouldPublishLeaseSet(ls.getDestination().calculateHash())) + return -3; if (ls.isCurrent(Router.CLOCK_FUDGE_FACTOR)) { // last time it was sent was before the last send period return KBucketSet.NUM_BUCKETS - bucket; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java index c4a100be0..1df8ccdc7 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java @@ -20,4 +20,6 @@ public interface DataStore { public DataStructure remove(Hash key); public Set getKeys(); public void restart(); + public int countLeaseSets(); + } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index dc4ddb9f2..c18b673aa 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -382,10 +382,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } public int getKnownLeaseSets() { - if (_kb == null) return 0; - CountLeaseSets count = new CountLeaseSets(); - _kb.getAll(count); - return count.size(); + if (_ds == null) return 0; + return _ds.countLeaseSets(); } private class CountLeaseSets implements SelectionCollector { @@ -476,6 +474,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { _log.error("wtf, locally published leaseSet is not valid?", iae); return; } + if (!_context.clientManager().shouldPublishLeaseSet(h)) + return; + synchronized (_explicitSendKeys) { _explicitSendKeys.add(h); } 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 68af74791..ee28d7c51 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -59,6 +59,22 @@ class PersistentDataStore extends TransientDataStore { _context.jobQueue().addJob(new WriteJob(key, data)); } + public int countLeaseSets() { + File dbDir = null; + try { + dbDir = getDbDir(); + } catch (IOException ioe) { + return 0; + } + if (dbDir == null) + return 0; + File leaseSetFiles[] = dbDir.listFiles(LeaseSetFilter.getInstance()); + if (leaseSetFiles == null) + return 0; + else + return leaseSetFiles.length; + } + private void accept(LeaseSet ls) { super.put(ls.getDestination().calculateHash(), ls); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java index a13b30517..6e5b1b717 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java @@ -37,6 +37,9 @@ public class RepublishLeaseSetJob extends JobImpl { } public String getName() { return "Republish a local leaseSet"; } public void runJob() { + if (!getContext().clientManager().shouldPublishLeaseSet(_dest)) + return; + try { if (getContext().clientManager().isLocal(_dest)) { LeaseSet ls = _facade.lookupLeaseSetLocally(_dest); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java index 0d4952490..11048844c 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java @@ -59,6 +59,9 @@ class TransientDataStore implements DataStore { return _data.containsKey(key); } } + + public int countLeaseSets() { return 0; } + /** nothing published more than 5 minutes in the future */ private final static long MAX_FUTURE_PUBLISH_DATE = 5*60*1000; diff --git a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java index 7d425d21e..4fe9555a9 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java +++ b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java @@ -30,7 +30,7 @@ public class PeerTestJob extends JobImpl { private Log _log; private PeerManager _manager; private boolean _keepTesting; - private static final long DEFAULT_PEER_TEST_DELAY = 60*1000; + private static final long DEFAULT_PEER_TEST_DELAY = 5*60*1000; private static final int TEST_PRIORITY = 100; /** Creates a new instance of PeerTestJob */ @@ -48,7 +48,7 @@ public class PeerTestJob extends JobImpl { /** how long to give each peer before marking them as unresponsive? */ private int getTestTimeout() { return 30*1000; } /** number of peers to test each round */ - private int getTestConcurrency() { return 2; } + private int getTestConcurrency() { return 1; } public void startTesting(PeerManager manager) { _manager = manager; diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java index 414aa95f5..0e00b892c 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java @@ -743,8 +743,11 @@ public class ProfileOrganizer { // the CLI shouldn't depend upon the netDb if (netDb == null) return true; if (_context.router() == null) return true; - if ( (_context.shitlist() != null) && (_context.shitlist().isShitlisted(peer)) ) + if ( (_context.shitlist() != null) && (_context.shitlist().isShitlisted(peer)) ) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Peer " + peer.toBase64() + " is shitlisted, dont select it"); return false; // never select a shitlisted peer + } if (null != netDb.lookupRouterInfoLocally(peer)) { if (_log.shouldLog(Log.INFO))