From 84bd8274ad627e376c6e2320849d95b64f4d491e Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 25 Feb 2009 00:05:30 +0000 Subject: [PATCH] * Router: Move addShutdownTask from Router to I2PAppContext so that apps can register more easily --- .../src/org/klomp/snark/SnarkManager.java | 5 ++-- .../net/i2p/router/web/ConfigNetHandler.java | 2 +- .../net/i2p/router/web/ConfigRestartBean.java | 8 +++--- .../i2p/router/web/ConfigServiceHandler.java | 12 ++++----- .../src/net/i2p/router/web/UpdateHandler.java | 2 +- core/java/src/net/i2p/I2PAppContext.java | 12 +++++++++ router/java/src/net/i2p/router/Router.java | 26 ++++++------------- 7 files changed, 34 insertions(+), 33 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 7b62ace84..54367af1a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -81,8 +81,7 @@ public class SnarkManager implements Snark.CompleteListener { I2PAppThread monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor"); monitor.setDaemon(true); monitor.start(); - if (_context instanceof RouterContext) - ((RouterContext)_context).router().addShutdownTask(new SnarkManagerShutdown()); + _context.addShutdownTask(new SnarkManagerShutdown()); } /** hook to I2PSnarkUtil for the servlet */ @@ -539,7 +538,7 @@ public class SnarkManager implements Snark.CompleteListener { String announce = info.getAnnounce(); // basic validation of url if ((!announce.startsWith("http://")) || - (announce.indexOf(".i2p/") < 0)) + (announce.indexOf(".i2p/") < 0)) // need to do better than this return "Non-i2p tracker in " + info.getName() + ", deleting it"; List files = info.getFiles(); if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java index 0ddcd58a9..a4fe7483e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java @@ -237,7 +237,7 @@ public class ConfigNetHandler extends FormHandler { private void hiddenSwitch() { // Full restart required to generate new keys - _context.router().addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART)); + _context.addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART)); _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java index 75a8108c5..e8eb6b26d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java @@ -25,20 +25,20 @@ public class ConfigRestartBean { String systemNonce = getNonce(); if ( (nonce != null) && (systemNonce.equals(nonce)) && (action != null) ) { if ("shutdownImmediate".equals(action)) { - ctx.router().addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_HARD)); + ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_HARD)); //ctx.router().shutdown(Router.EXIT_HARD); // never returns ctx.router().shutdownGracefully(Router.EXIT_HARD); // give the UI time to respond } else if ("cancelShutdown".equals(action)) { ctx.router().cancelGracefulShutdown(); } else if ("restartImmediate".equals(action)) { - ctx.router().addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_HARD_RESTART)); + ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_HARD_RESTART)); //ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns ctx.router().shutdownGracefully(Router.EXIT_HARD_RESTART); // give the UI time to respond } else if ("restart".equals(action)) { - ctx.router().addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART)); + ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART)); ctx.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART); } else if ("shutdown".equals(action)) { - ctx.router().addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL)); + ctx.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL)); ctx.router().shutdownGracefully(); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java index bd3bf7a5e..8d3e5725c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java @@ -53,31 +53,31 @@ public class ConfigServiceHandler extends FormHandler { if (_action == null) return; if ("Shutdown gracefully".equals(_action)) { - _context.router().addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_GRACEFUL)); + _context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_GRACEFUL)); _context.router().shutdownGracefully(); addFormNotice("Graceful shutdown initiated"); } else if ("Shutdown immediately".equals(_action)) { - _context.router().addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_HARD)); + _context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_HARD)); _context.router().shutdown(Router.EXIT_HARD); addFormNotice("Shutdown immediately! boom bye bye bad bwoy"); } else if ("Cancel graceful shutdown".equals(_action)) { _context.router().cancelGracefulShutdown(); addFormNotice("Graceful shutdown cancelled"); } else if ("Graceful restart".equals(_action)) { - _context.router().addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART)); + _context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART)); _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART); addFormNotice("Graceful restart requested"); } else if ("Hard restart".equals(_action)) { - _context.router().addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_HARD_RESTART)); + _context.addShutdownTask(new UpdateWrapperManagerTask(Router.EXIT_HARD_RESTART)); _context.router().shutdown(Router.EXIT_HARD_RESTART); addFormNotice("Hard restart requested"); } else if ("Rekey and Restart".equals(_action)) { addFormNotice("Rekeying after graceful restart"); - _context.router().addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART)); + _context.addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART)); _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART); } else if ("Rekey and Shutdown".equals(_action)) { addFormNotice("Rekeying after graceful shutdown"); - _context.router().addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL)); + _context.addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL)); _context.router().shutdownGracefully(Router.EXIT_GRACEFUL); } else if ("Run I2P on startup".equals(_action)) { installService(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java index be39da2fd..83495f33e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java @@ -185,7 +185,7 @@ public class UpdateHandler { } private void restart() { - _context.router().addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART)); + _context.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART)); _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART); } diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java index 6b3b0fd5b..f26f74ab7 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -23,6 +23,7 @@ import net.i2p.crypto.SessionKeyManager; import net.i2p.data.RoutingKeyGenerator; import net.i2p.stat.StatManager; import net.i2p.util.Clock; +import net.i2p.util.ConcurrentHashSet; import net.i2p.util.FortunaRandomSource; import net.i2p.util.KeyRing; import net.i2p.util.LogManager; @@ -94,6 +95,7 @@ public class I2PAppContext { private volatile boolean _randomInitialized; private volatile boolean _keyGeneratorInitialized; protected volatile boolean _keyRingInitialized; // used in RouterContext + private Set<Runnable> _shutdownTasks; /** @@ -152,6 +154,7 @@ public class I2PAppContext { _elGamalAESEngineInitialized = false; _logManagerInitialized = false; _keyRingInitialized = false; + _shutdownTasks = new ConcurrentHashSet(0); } /** @@ -557,4 +560,13 @@ public class I2PAppContext { _randomInitialized = true; } } + + public void addShutdownTask(Runnable task) { + _shutdownTasks.add(task); + } + + public Set<Runnable> getShutdownTasks() { + return new HashSet(_shutdownTasks); + } + } diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 77e4b1968..13e801458 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -65,7 +65,6 @@ public class Router { private I2PThread.OOMEventListener _oomListener; private ShutdownHook _shutdownHook; private I2PThread _gracefulShutdownDetector; - private Set _shutdownTasks; public final static String PROP_CONFIG_FILE = "router.configLocation"; @@ -171,7 +170,6 @@ public class Router { watchdog.setDaemon(true); watchdog.start(); - _shutdownTasks = new HashSet(0); } /** @@ -491,13 +489,12 @@ public class Router { */ public void rebuildNewIdentity() { killKeys(); - try { - for (Iterator iter = _shutdownTasks.iterator(); iter.hasNext(); ) { - Runnable task = (Runnable)iter.next(); + for (Runnable task : _context.getShutdownTasks()) { + try { task.run(); + } catch (Throwable t) { + _log.log(Log.CRIT, "Error running shutdown task", t); } - } catch (Throwable t) { - _log.log(Log.CRIT, "Error running shutdown task", t); } // hard and ugly finalShutdown(EXIT_HARD_RESTART); @@ -782,12 +779,6 @@ public class Router { buf.setLength(0); } - public void addShutdownTask(Runnable task) { - synchronized (_shutdownTasks) { - _shutdownTasks.add(task); - } - } - public static final int EXIT_GRACEFUL = 2; public static final int EXIT_HARD = 3; public static final int EXIT_OOM = 10; @@ -800,13 +791,12 @@ public class Router { I2PThread.removeOOMEventListener(_oomListener); // Run the shutdown hooks first in case they want to send some goodbye messages // Maybe we need a delay after this too? - try { - for (Iterator iter = _shutdownTasks.iterator(); iter.hasNext(); ) { - Runnable task = (Runnable)iter.next(); + for (Runnable task : _context.getShutdownTasks()) { + try { task.run(); + } catch (Throwable t) { + _log.log(Log.CRIT, "Error running shutdown task", t); } - } catch (Throwable t) { - _log.log(Log.CRIT, "Error running shutdown task", t); } try { _context.clientManager().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the client manager", t); } try { _context.jobQueue().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the job queue", t); } -- GitLab