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 3e866842deba6c97020171f54fc38a610b384a51..e19a4a2ed341e2e7872aeff418beb6905df7ec44 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -269,8 +269,9 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad // 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 || + // yikes2 don't do this either - deadlock! // getKnownRouters() < MIN_REMAINING_ROUTERS || if (info.getNetworkId() == Router.NETWORK_ID && - (getKnownRouters() < MIN_REMAINING_ROUTERS || + (getKBucketSetSize() < MIN_REMAINING_ROUTERS || _context.router().getUptime() < DONT_FAIL_PERIOD || _context.commSystem().countActivePeers() <= MIN_ACTIVE_PEERS)) { if (_log.shouldLog(Log.WARN)) 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 003d3f50b9586c39c02e8636aff06c06840c3556..763005e8ca362dd7d34a651550f3f693dc6eeb63 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -420,6 +420,16 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } } + /** + * This is fast and doesn't use synchronization, + * but it includes both routerinfos and leasesets. + * Use it to avoid deadlocks. + */ + protected int getKBucketSetSize() { + if (_kb == null) return 0; + return _kb.size(); + } + public void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs) { if (!_initialized) return; LeaseSet ls = lookupLeaseSetLocally(key);