You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2017/08/30 13:53:45 UTC
karaf git commit: [KARAF-5327] Threads not stopped on karaf.restart +
bundle(0).stop()
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 <gn...@apache.org>
Authored: Wed Aug 30 11:56:29 2017 +0200
Committer: Guillaume Nodet <gn...@apache.org>
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);
}