From 854998832df92fb52ed29b8e0139aac6251ee1fc Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 13 Feb 2011 20:36:43 +0000 Subject: [PATCH] * NetDB: Prevent ExpireLeaseJob NPE (thanks sponge) --- history.txt | 6 +++++ .../src/net/i2p/router/RouterVersion.java | 2 +- .../networkdb/kademlia/ExpireLeasesJob.java | 26 +++++++++---------- .../networkdb/kademlia/ExpireRoutersJob.java | 20 +++++++------- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/history.txt b/history.txt index 415d544e80..550bf53041 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,9 @@ +2011-02-13 zzz + * Connect Client: Minor NPE fix cleanup + * JobQueue: Prevet NPE at shutdown (thanks liberty) + * GeoIP: Prevent startup NPE (ticket #413, thanks RN) + * NetDB: Prevent ExpireLeaseJob NPE (thanks sponge) + 2011-02-11 Mathiasdm * routerconsole: fixed graphs using jrobin; and headless issue in general: no more switches between headless and non-headless. diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f2522cd4ed..7ca1a3ec2c 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 9; + public final static long BUILD = 10; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java index 59d8fc4291..6ea401d667 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java @@ -9,7 +9,7 @@ package net.i2p.router.networkdb.kademlia; */ import java.util.HashSet; -import java.util.Iterator; +import java.util.Map; import java.util.Set; import net.i2p.data.DatabaseEntry; @@ -27,8 +27,8 @@ import net.i2p.util.Log; * */ class ExpireLeasesJob extends JobImpl { - private Log _log; - private KademliaNetworkDatabaseFacade _facade; + private final Log _log; + private final KademliaNetworkDatabaseFacade _facade; private final static long RERUN_DELAY_MS = 1*60*1000; @@ -39,11 +39,11 @@ class ExpireLeasesJob extends JobImpl { } public String getName() { return "Expire Lease Sets Job"; } + public void runJob() { - Set toExpire = selectKeysToExpire(); + Set toExpire = selectKeysToExpire(); _log.info("Leases to expire: " + toExpire); - for (Iterator iter = toExpire.iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); + for (Hash key : toExpire) { _facade.fail(key); //_log.info("Lease " + key + " is expiring, so lets look for it again", new Exception("Expire and search")); //_facade.lookupLeaseSet(key, null, null, RERUN_DELAY_MS); @@ -57,17 +57,15 @@ class ExpireLeasesJob extends JobImpl { * don't have any leases that haven't yet passed, even with the CLOCK_FUDGE_FACTOR) * */ - private Set selectKeysToExpire() { - Set keys = _facade.getDataStore().getKeys(); - Set toExpire = new HashSet(128); - for (Iterator iter = keys.iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); - DatabaseEntry obj = _facade.getDataStore().get(key); + private Set selectKeysToExpire() { + Set toExpire = new HashSet(128); + for (Map.Entry entry : _facade.getDataStore().getMapEntries()) { + DatabaseEntry obj = entry.getValue(); if (obj.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { LeaseSet ls = (LeaseSet)obj; if (!ls.isCurrent(Router.CLOCK_FUDGE_FACTOR)) - toExpire.add(key); - else + toExpire.add(entry.getKey()); + else if (_log.shouldLog(Log.DEBUG)) _log.debug("Lease " + ls.getDestination().calculateHash() + " is current, no need to expire"); } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java index 1d7de01389..60bfb6e3aa 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java @@ -9,7 +9,6 @@ package net.i2p.router.networkdb.kademlia; */ import java.util.Collections; -import java.util.Iterator; import java.util.Set; import net.i2p.data.Hash; @@ -28,8 +27,8 @@ import net.i2p.util.Log; * */ class ExpireRoutersJob extends JobImpl { - private Log _log; - private KademliaNetworkDatabaseFacade _facade; + private final Log _log; + private final KademliaNetworkDatabaseFacade _facade; /** rerun fairly often, so the fails don't queue up too many netdb searches at once */ private final static long RERUN_DELAY_MS = 120*1000; @@ -41,11 +40,13 @@ class ExpireRoutersJob extends JobImpl { } public String getName() { return "Expire Routers Job"; } + public void runJob() { - Set toExpire = selectKeysToExpire(); - _log.info("Routers to expire (drop and try to refetch): " + toExpire); - for (Iterator iter = toExpire.iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); + // this always returns an empty set (see below) + Set toExpire = selectKeysToExpire(); + if (_log.shouldLog(Log.INFO)) + _log.info("Routers to expire (drop and try to refetch): " + toExpire); + for (Hash key : toExpire) { _facade.fail(key); } _facade.queueForExploration(toExpire); @@ -61,9 +62,8 @@ class ExpireRoutersJob extends JobImpl { * * @return nothing for now */ - private Set selectKeysToExpire() { - for (Iterator iter = _facade.getAllRouters().iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); + private Set selectKeysToExpire() { + for (Hash key : _facade.getAllRouters()) { // Don't expire anybody we are connected to if (!getContext().commSystem().isEstablished(key)) { // This does a _facade.validate() and fail() which is sufficient...