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);
                 }