Repository: karaf Updated Branches: refs/heads/master d40d0074a -> 447f36e29
[KARAF-5327] Threads not stopped on karaf.restart + bundle(0).stop() Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/447f36e2 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/447f36e2 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/447f36e2 Branch: refs/heads/master Commit: 447f36e2921c4bf4d7b2e40ca09eb0c43e6840be Parents: d40d007 Author: Guillaume Nodet <[email protected]> Authored: Wed Aug 30 11:56:29 2017 +0200 Committer: Guillaume Nodet <[email protected]> Committed: Wed Aug 30 11:56:29 2017 +0200 ---------------------------------------------------------------------- .../org/apache/karaf/main/InstanceHelper.java | 7 +-- .../main/java/org/apache/karaf/main/Main.java | 52 +++++++++++++++++--- .../apache/karaf/main/ShutdownSocketThread.java | 13 ++++- 3 files changed, 60 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/447f36e2/main/src/main/java/org/apache/karaf/main/InstanceHelper.java ---------------------------------------------------------------------- diff --git a/main/src/main/java/org/apache/karaf/main/InstanceHelper.java b/main/src/main/java/org/apache/karaf/main/InstanceHelper.java index afff572..5cf5826 100644 --- a/main/src/main/java/org/apache/karaf/main/InstanceHelper.java +++ b/main/src/main/java/org/apache/karaf/main/InstanceHelper.java @@ -134,7 +134,7 @@ public class InstanceHelper { } } - static void setupShutdown(ConfigProperties config, Framework framework) { + static AutoCloseable setupShutdown(ConfigProperties config, Framework framework) { writePid(config.pidFile); try { int port = config.shutdownPort; @@ -153,13 +153,14 @@ public class InstanceHelper { w.write(Integer.toString(port)); w.close(); } - Thread thread = new ShutdownSocketThread(shutdown, shutdownSocket, framework); - thread.setDaemon(true); + ShutdownSocketThread thread = new ShutdownSocketThread(shutdown, shutdownSocket, framework); thread.start(); + return thread; } } catch (Exception e) { e.printStackTrace(); } + return null; } } http://git-wip-us.apache.org/repos/asf/karaf/blob/447f36e2/main/src/main/java/org/apache/karaf/main/Main.java ---------------------------------------------------------------------- diff --git a/main/src/main/java/org/apache/karaf/main/Main.java b/main/src/main/java/org/apache/karaf/main/Main.java index 1748b3f..8699e70 100644 --- a/main/src/main/java/org/apache/karaf/main/Main.java +++ b/main/src/main/java/org/apache/karaf/main/Main.java @@ -89,6 +89,8 @@ public class Main { private Lock lock; private KarafLockCallback lockCallback; private boolean exiting; + private AutoCloseable shutdownThread; + private Thread monitorThread; /** * <p> @@ -284,7 +286,7 @@ public class Main { if (config.delayConsoleStart) { new StartupListener(LOG, framework.getBundleContext()); } - monitor(); + monitorThread = monitor(); registerSignalHandler(); watchdog(); } @@ -359,8 +361,8 @@ public class Main { } } - private void monitor() { - new Thread("Karaf Lock Monitor Thread") { + private Thread monitor() { + Thread th = new Thread("Karaf Lock Monitor Thread") { public void run() { try { doMonitor(); @@ -368,7 +370,9 @@ public class Main { e.printStackTrace(); } } - }.start(); + }; + th.start(); + return th; } private void doMonitor() throws Exception { @@ -387,10 +391,16 @@ public class Main { if (!lock.isAlive() || exiting) { break; } - Thread.sleep(config.lockDelay); + try { + Thread.sleep(config.lockDelay); + } catch (InterruptedException e) { + // Ignore + } } if (!exiting) { lockCallback.lockLost(); + } else { + lockCallback.stopShutdownThread(); } } else { if (config.lockSlaveBlock) { @@ -401,7 +411,11 @@ public class Main { lockCallback.waitingForLock(); } } - Thread.sleep(config.lockDelay); + try { + Thread.sleep(config.lockDelay); + } catch (InterruptedException e) { + // Ignore + } } } @@ -623,7 +637,7 @@ public class Main { while (framework.getState() != Bundle.STARTING && framework.getState() != Bundle.ACTIVE) { Thread.sleep(10); } - monitor(); + monitorThread = monitor(); } else { return; } @@ -667,10 +681,19 @@ public class Main { return true; } } + return false; } finally { if (lock != null) { exiting = true; + if (monitorThread != null) { + try { + monitorThread.interrupt(); + monitorThread.join(); + } finally { + monitorThread = null; + } + } lock.release(); } } @@ -681,6 +704,7 @@ public class Main { @Override public void lockLost() { + stopShutdownThread(); if (framework.getState() == Bundle.ACTIVE) { LOG.warning("Lock lost. Setting startlevel to " + config.lockStartLevel); synchronized (startLevelLock) { @@ -699,10 +723,22 @@ public class Main { } } + public void stopShutdownThread() { + if (shutdownThread != null) { + try { + shutdownThread.close(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + shutdownThread = null; + } + } + } + @Override public void lockAquired() { LOG.info("Lock acquired. Setting startlevel to " + config.defaultStartLevel); - InstanceHelper.setupShutdown(config, framework); + shutdownThread = InstanceHelper.setupShutdown(config, framework); setStartLevel(config.defaultStartLevel); } http://git-wip-us.apache.org/repos/asf/karaf/blob/447f36e2/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java ---------------------------------------------------------------------- diff --git a/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java b/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java index 982ff52..64df3b9 100644 --- a/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java +++ b/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java @@ -30,7 +30,7 @@ import java.util.logging.Logger; import org.osgi.framework.launch.Framework; -class ShutdownSocketThread extends Thread { +class ShutdownSocketThread extends Thread implements AutoCloseable { Logger LOG = Logger.getLogger(this.getClass().getName()); @@ -38,14 +38,22 @@ class ShutdownSocketThread extends Thread { private Random random = null; private ServerSocket shutdownSocket; private Framework framework; + private boolean closing; public ShutdownSocketThread(String shutdown, ServerSocket shutdownSocket, Framework framework) { super("Karaf Shutdown Socket Thread"); + setDaemon(true); this.shutdown = shutdown; this.shutdownSocket = shutdownSocket; this.framework = framework; } + @Override + public void close() throws Exception { + closing = true; + shutdownSocket.close(); + } + public void run() { try { while (true) { @@ -70,6 +78,9 @@ class ShutdownSocketThread extends Thread { + ace.getMessage(), ace); continue; } catch (IOException e) { + if (closing) { + return; + } LOG.log(Level.SEVERE, "Karaf shutdown socket: accept: ", e); System.exit(1); }
