From 6ce2767514b2afd6501664a55983a80d93764779 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 10 Nov 2008 20:28:47 +0000 Subject: [PATCH] * NetDb: Fix a deadlock caused by last checkin --- .../kademlia/FloodfillNetworkDatabaseFacade.java | 3 ++- .../kademlia/KademliaNetworkDatabaseFacade.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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 3e866842de..e19a4a2ed3 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 003d3f50b9..763005e8ca 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); -- GitLab