diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java index ad9ed45bfeadbe7896f89dcb25f2a97fc5431062..3e866842deba6c97020171f54fc38a610b384a51 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -20,6 +20,7 @@ import net.i2p.router.JobImpl; import net.i2p.router.MessageSelector; import net.i2p.router.OutNetMessage; import net.i2p.router.ReplyJob; +import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.TunnelInfo; import net.i2p.util.Log; @@ -256,7 +257,27 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad return sel.selectFloodfillParticipants(getKBuckets()); } + /** NTCP cons drop quickly but SSU takes a while, so it's prudent to keep this + * a little higher than 1 or 2. */ + protected final static int MIN_ACTIVE_PEERS = 5; + + /** + * Search for a newer router info, drop it from the db if the search fails, + * unless just started up or have bigger problems. + */ protected void lookupBeforeDropping(Hash peer, RouterInfo info) { + // following are some special situations, we don't want to + // drop the peer in these cases + // yikes don't do this - stack overflow // getFloodfillPeers().size() == 0 || + if (info.getNetworkId() == Router.NETWORK_ID && + (getKnownRouters() < MIN_REMAINING_ROUTERS || + _context.router().getUptime() < DONT_FAIL_PERIOD || + _context.commSystem().countActivePeers() <= MIN_ACTIVE_PEERS)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Not failing " + peer.toBase64() + " as we are just starting up or have problems"); + return; + } + if (_context.jobQueue().getMaxLag() > 500) { // don't try to overload ourselves (e.g. failing 3000 router refs at // once, and then firing off 3000 netDb lookup tasks) 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 e4cdc3f2f76ad4c74e67c1fea45faf150aa3dec2..003d3f50b9586c39c02e8636aff06c06840c3556 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -99,7 +99,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { * offline for a while, we'll have a chance of finding some live peers with the * previous references */ - private final static long DONT_FAIL_PERIOD = 10*60*1000; + protected final static long DONT_FAIL_PERIOD = 10*60*1000; /** don't probe or broadcast data, just respond and search when explicitly needed */ private boolean _quiet = false; @@ -111,8 +111,10 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public final static String PROP_DB_DIR = "router.networkDatabase.dbDir"; public final static String DEFAULT_DB_DIR = "netDb"; - /** if we have less than 5 routers left, don't drop any more, even if they're failing or doing bad shit */ - private final static int MIN_REMAINING_ROUTERS = 5; + /** if we have less than this many routers left, don't drop any more, + * even if they're failing or doing bad shit. + */ + protected final static int MIN_REMAINING_ROUTERS = 25; /** * dont accept any dbDtore of a router over 24 hours old (unless we dont @@ -756,24 +758,6 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { isRouterInfo = true; if (isRouterInfo) { - if (((RouterInfo)o).getNetworkId() != Router.NETWORK_ID) { - // definitely drop them - } else { - int remaining = _kb.size(); - if (remaining < MIN_REMAINING_ROUTERS) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Not removing " + dbEntry + " because we have so few routers left (" - + remaining + ") - perhaps a reseed is necessary?"); - return; - } - if (System.currentTimeMillis() < _started + DONT_FAIL_PERIOD) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Not failing the key " + dbEntry.toBase64() - + " since we've just started up and don't want to drop /everyone/"); - return; - } - } - lookupBeforeDropping(dbEntry, (RouterInfo)o); return; } else { @@ -806,6 +790,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } } + /** don't use directly - see F.N.D.F. override */ protected void lookupBeforeDropping(Hash peer, RouterInfo info) { //bah, humbug. dropAfterLookupFailed(peer, info); diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index 6190bdabbf4bdacbc0a5d73065c6b2d11c803cd0..41ec2fedf0205e7f9ae6ace5891857e2f387f907 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -311,8 +311,11 @@ public class TransportManager implements TransportEventListener { } } if (unreachableTransports >= _transports.size()) { - _context.statManager().addRateData("transport.shitlistOnUnreachable", msg.getLifetime(), msg.getLifetime()); - _context.shitlist().shitlistRouter(peer, "Unreachable on any transport"); + // Don't shitlist if we aren't talking to anybody, as we may have a network connection issue + if (unreachableTransports >= _transports.size() && countActivePeers() > 0) { + _context.statManager().addRateData("transport.shitlistOnUnreachable", msg.getLifetime(), msg.getLifetime()); + _context.shitlist().shitlistRouter(peer, "Unreachable on any transport"); + } } else if (rv == null) { _context.statManager().addRateData("transport.noBidsYetNotAllUnreachable", unreachableTransports, msg.getLifetime()); }