From 0fa5fa40e160920fdb7827613d25111846b01eb0 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 18 Jun 2011 19:58:50 +0000 Subject: [PATCH] * Shutdown: - More job queue cleanups - RouterInfo readin job checks for quick shutdown - Note that we should improve profile read job --- router/java/src/net/i2p/router/JobQueue.java | 16 ++++++++++++---- .../networkdb/kademlia/PersistentDataStore.java | 3 +++ .../net/i2p/router/peermanager/PeerManager.java | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index 7f5cb008fe..4dcdc186ab 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -280,14 +280,22 @@ public class JobQueue { void shutdown() { _alive = false; - _timedJobs.clear(); - _readyJobs.clear(); + synchronized (_jobLock) { + _timedJobs.clear(); + _readyJobs.clear(); + _jobLock.notifyAll(); + } // The JobQueueRunners are NOT daemons, // so they must be stopped. Job poison = new PoisonJob(); - for (int i = 0; i < _queueRunners.size(); i++) + for (JobQueueRunner runner : _queueRunners.values()) { + runner.stopRunning(); _readyJobs.offer(poison); - + // TODO interrupt thread for each runner + } + _queueRunners.clear(); + _jobStats.clear(); + _runnerId = 0; /******** if (_log.shouldLog(Log.WARN)) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index ad938e7ed3..5941919144 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -359,6 +359,9 @@ class PersistentDataStore extends TransientDataStore { if (routerInfoFiles.length > 5) _alreadyWarned = false; for (int i = 0; i < routerInfoFiles.length; i++) { + // drop out if the router gets killed right after startup + if (!_context.router().isAlive()) + break; Hash key = getRouterInfoHash(routerInfoFiles[i].getName()); if ( (key != null) && (!isKnown(key)) ) { // Run it inline so we don't clog up the job queue, esp. at startup diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java index 633f966500..e9ca57cb9c 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerManager.java +++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java @@ -117,6 +117,7 @@ class PeerManager { } void loadProfiles() { + // TODO do this in a Thread or a Job to not slow down the constructor Set profiles = _persistenceHelper.readProfiles(); for (Iterator iter = profiles.iterator(); iter.hasNext();) { PeerProfile prof = iter.next();