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 2013/10/04 10:46:25 UTC

svn commit: r1529102 - in /karaf/trunk/main/src: main/java/org/apache/karaf/main/Main.java main/java/org/apache/karaf/main/lock/LockManager.java test/java/org/apache/karaf/main/MainLockingTest.java

Author: gnodet
Date: Fri Oct  4 08:46:25 2013
New Revision: 1529102

URL: http://svn.apache.org/r1529102
Log:
[KARAF-2499] Karaf should exit if the data directory is deleted

Removed:
    karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/LockManager.java
Modified:
    karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
    karaf/trunk/main/src/test/java/org/apache/karaf/main/MainLockingTest.java

Modified: karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java?rev=1529102&r1=1529101&r2=1529102&view=diff
==============================================================================
--- karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java (original)
+++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java Fri Oct  4 08:46:25 2013
@@ -39,7 +39,6 @@ import java.util.logging.Logger;
 import org.apache.karaf.info.ServerInfo;
 import org.apache.karaf.main.lock.Lock;
 import org.apache.karaf.main.lock.LockCallBack;
-import org.apache.karaf.main.lock.LockManager;
 import org.apache.karaf.main.lock.NoLock;
 import org.apache.karaf.main.util.ArtifactResolver;
 import org.apache.karaf.main.util.BootstrapLogManager;
@@ -83,7 +82,9 @@ public class Main {
     private int exitCode;
     private ShutdownCallback shutdownCallback;
     private KarafActivatorManager activatorManager;
-    private LockManager lockManager;
+    private Lock lock;
+    private KarafLockCallback lockCallback;
+    private boolean exiting;
     
     /**
      * <p>
@@ -217,9 +218,8 @@ public class Main {
             System.out.println(config.startupMessage);
         }
         BootstrapLogManager.setProperties(config.props);
-        Lock lock = createLock();
-        KarafLockCallback lockCallback = new KarafLockCallback();
-        lockManager = new LockManager(lock, lockCallback, config.lockDelay);
+        lock = createLock();
+        lockCallback = new KarafLockCallback();
         InstanceHelper.updateInstancePid(config.karafHome, config.karafBase);
         LOG.addHandler(BootstrapLogManager.getDefaultHandler());
 
@@ -262,7 +262,52 @@ public class Main {
         if (config.delayConsoleStart) {
             new StartupListener(LOG, framework.getBundleContext());
         }
-        lockManager.startLockMonitor();
+        monitor();
+    }
+
+    private void monitor() {
+        new Thread() {
+            public void run() {
+                doMonitor();
+            }
+        }.start();
+    }
+
+    private void doMonitor() {
+        File dataDir = new File(System.getProperty(ConfigProperties.PROP_KARAF_DATA));
+        while (!exiting) {
+            try {
+                if (lock.lock()) {
+                    lockCallback.lockAquired();
+                    for (;;) {
+                        if (!dataDir.isDirectory()) {
+                            LOG.info("Data directory does not exist anymore, halting");
+                            framework.stop();
+                            System.exit(-1);
+                            return;
+                        }
+                        if (!lock.isAlive() || exiting) {
+                            break;
+                        }
+                        Thread.sleep(config.lockDelay);
+                    }
+                    if (!exiting) {
+                        lockCallback.lockLost();
+                    }
+                } else {
+                    lockCallback.waitingForLock();
+                }
+                Thread.sleep(config.lockDelay);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    Lock getLock() {
+        return lock;
     }
     
     private ClassLoader createClassLoader(ArtifactResolver resolver) throws Exception {
@@ -444,7 +489,7 @@ public class Main {
                 shutdownCallback.waitingForShutdown(step);
             }
 
-            lockManager.stopLockMonitor();
+            exiting = true;
 
             if (framework.getState() == Bundle.ACTIVE || framework.getState() == Bundle.STARTING) {
                 new Thread() {
@@ -475,17 +520,13 @@ public class Main {
             }
             return false;
         } finally {
-            if (lockManager != null) {
-                lockManager.stopLockMonitor();
-                lockManager.unlock();
+            if (lock != null) {
+                exiting = true;
+                lock.release();
             }
         }
     }
     
-    public LockManager getLockManager() {
-        return lockManager;
-    }
-
     private final class KarafLockCallback implements LockCallBack, FrameworkListener {
         private Object startLevelLock = new Object();
 

Modified: karaf/trunk/main/src/test/java/org/apache/karaf/main/MainLockingTest.java
URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/MainLockingTest.java?rev=1529102&r1=1529101&r2=1529102&view=diff
==============================================================================
--- karaf/trunk/main/src/test/java/org/apache/karaf/main/MainLockingTest.java (original)
+++ karaf/trunk/main/src/test/java/org/apache/karaf/main/MainLockingTest.java Fri Oct  4 08:46:25 2013
@@ -68,7 +68,7 @@ public class MainLockingTest {
         
         FrameworkStartLevel sl = framework.adapt(FrameworkStartLevel.class);
         
-        MockLock lock = (MockLock) main.getLockManager().getLock();        
+        MockLock lock = (MockLock) main.getLock();
 
         Assert.assertEquals(100, sl.getStartLevel());