From ee82a6196d057ea0bd4bc8432efb1a10f7f1c683 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 31 Jul 2011 13:32:44 +0000 Subject: [PATCH] * Netdb: Add a job to refresh all the old router infos at startup, to speed integration --- history.txt | 7 ++ .../src/net/i2p/router/RouterVersion.java | 2 +- .../FloodfillNetworkDatabaseFacade.java | 5 ++ .../networkdb/kademlia/RefreshRoutersJob.java | 82 +++++++++++++++++++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java diff --git a/history.txt b/history.txt index 447fba9be0..a88acadd8a 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,10 @@ +2011-07-31 zzz + * Crypto: Implement and then comment out an alternate + AES-256/CBC implementation using the JVM crypto libs, + and tests, it isn't faster + * Netdb: Add a job to refresh all the old router infos at startup, + to speed integration + 2011-07-30 kytv * Installer: - add libjbigi*core*jnilib, libjbigi-osx-none_64.jnilib, and diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 80cfb9c849..5b1ba79e39 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 = 18; + public final static long BUILD = 19; /** for example "-test" */ public final static String EXTRA = ""; 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 2039b8db53..10a4dd87ad 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -65,6 +65,11 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad super.startup(); _context.jobQueue().addJob(new FloodfillMonitorJob(_context, this)); _lookupThrottler = new LookupThrottler(); + + // refresh old routers + Job rrj = new RefreshRoutersJob(_context, this); + rrj.getTiming().setStartAfter(_context.clock().now() + 5*60*1000); + _context.jobQueue().addJob(rrj); } @Override diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java new file mode 100644 index 0000000000..5e561e5a5b --- /dev/null +++ b/router/java/src/net/i2p/router/networkdb/kademlia/RefreshRoutersJob.java @@ -0,0 +1,82 @@ +package net.i2p.router.networkdb.kademlia; + +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import net.i2p.data.Hash; +import net.i2p.data.RouterInfo; +import net.i2p.router.JobImpl; +import net.i2p.router.RouterContext; +import net.i2p.util.Log; + +/** + * Go through all the routers once, after startup, and refetch their router infos. + * This should be run once after startup (and preferably after any reseed is complete, + * but we don't have any indication when that is). + * This will help routers that start after being shutdown for many days or weeks, + * as well as newly-reseeded routers, since + * validate() in KNDF doesn't start failing and refetching until the router has been + * up for an hour. + * To improve integration even more, we fetch the floodfills first. + * Ideally this should complete within the first half-hour of uptime. + * + * @since 0.8.8 + */ +class RefreshRoutersJob extends JobImpl { + private final Log _log; + private final FloodfillNetworkDatabaseFacade _facade; + private List _routers; + + /** rerun fairly often. 1500 routers in 50 minutes */ + private final static long RERUN_DELAY_MS = 2*1000; + private final static long EXPIRE = 60*60*1000; + + public RefreshRoutersJob(RouterContext ctx, FloodfillNetworkDatabaseFacade facade) { + super(ctx); + _log = ctx.logManager().getLog(RefreshRoutersJob.class); + _facade = facade; + } + + public String getName() { return "Refresh Routers Job"; } + + public void runJob() { + if (_facade.isInitialized()) { + if (_routers == null) { + // make a list of all routers, floodfill first + _routers = _facade.getFloodfillPeers(); + int ff = _routers.size(); + Set all = _facade.getAllRouters(); + all.removeAll(_routers); + int non = all.size(); + _routers.addAll(all); + if (_log.shouldLog(Log.INFO)) + _log.info("To check: " + ff + " floodfills and " + non + " non-floodfills"); + } + if (_routers.isEmpty()) { + if (_log.shouldLog(Log.INFO)) + _log.info("Finished"); + return; + } + long expire = getContext().clock().now() - EXPIRE; + for (Iterator iter = _routers.iterator(); iter.hasNext(); ) { + Hash h = iter.next(); + iter.remove(); + if (h.equals(getContext().routerHash())) + continue; + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Checking " + h); + RouterInfo ri = _facade.lookupRouterInfoLocally(h); + if (ri == null) + continue; + if (ri.getPublished() < expire) { + if (_log.shouldLog(Log.INFO)) + _log.info("Refreshing " + h); + _facade.search(h, null, null, 15*1000, false); + break; + } + } + } + requeue(RERUN_DELAY_MS); + } +}