You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2016/08/22 15:31:47 UTC

karaf git commit: [KARAF-4188] Add support for Systemd's watchdog

Repository: karaf
Updated Branches:
  refs/heads/karaf-4.0.x 5cca72ffa -> 020d255ca


[KARAF-4188] Add support for Systemd's watchdog


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/020d255c
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/020d255c
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/020d255c

Branch: refs/heads/karaf-4.0.x
Commit: 020d255ca4dc4da3b94651db45c1a85fffd8a6e9
Parents: 5cca72f
Author: lburgazzoli <lb...@gmail.com>
Authored: Thu Dec 3 11:09:42 2015 +0100
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Mon Aug 22 16:22:02 2016 +0200

----------------------------------------------------------------------
 assemblies/apache-karaf/pom.xml                 |  3 +
 .../resources/etc/config.properties             |  5 ++
 main/pom.xml                                    |  8 +++
 .../main/java/org/apache/karaf/main/Main.java   | 35 ++++++++++-
 .../org/apache/karaf/main/internal/Systemd.java | 64 ++++++++++++++++++++
 .../karaf/main/internal/SystemdDaemon.java      | 34 +++++++++++
 pom.xml                                         | 14 ++++-
 7 files changed, 161 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/020d255c/assemblies/apache-karaf/pom.xml
----------------------------------------------------------------------
diff --git a/assemblies/apache-karaf/pom.xml b/assemblies/apache-karaf/pom.xml
index 84c54ec..b5fdf07 100644
--- a/assemblies/apache-karaf/pom.xml
+++ b/assemblies/apache-karaf/pom.xml
@@ -205,6 +205,9 @@
 
                         <library>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.activator/${servicemix.specs.version};type:=default;export:=true</library>
                         <library>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.locator/${servicemix.specs.version};type:=default;export:=true</library>
+
+                        <library>mvn:net.java.dev.jna/jna/${jna.version};type:=boot;export:=false</library>
+                        <library>mvn:net.java.dev.jna/jna-platform/${jna.version};type:=boot;export:=false</library>
                     </libraries>
                 </configuration>
             </plugin>

http://git-wip-us.apache.org/repos/asf/karaf/blob/020d255c/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
----------------------------------------------------------------------
diff --git a/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties b/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
index 5869113..a4e4b4d 100644
--- a/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
+++ b/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
@@ -205,3 +205,8 @@ org.ops4j.pax.url.mvn.requireConfigAdminConfig=true
 # Don't delay the console startup. Set to true if you want the console to start after all other bundles
 #
 karaf.delay.console=false
+
+#
+# Enable native Karaf support for systemd's watchdog.
+#
+# karkaraf.systemd.enabled=false

http://git-wip-us.apache.org/repos/asf/karaf/blob/020d255c/main/pom.xml
----------------------------------------------------------------------
diff --git a/main/pom.xml b/main/pom.xml
index 679c34d..92dd573 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -54,6 +54,14 @@
             <groupId>org.apache.karaf</groupId>
             <artifactId>org.apache.karaf.util</artifactId>
         </dependency>
+        <dependency>
+            <groupId>net.java.dev.jna</groupId>
+            <artifactId>jna</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.java.dev.jna</groupId>
+            <artifactId>jna-platform</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/karaf/blob/020d255c/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 9498082..a760a66 100644
--- a/main/src/main/java/org/apache/karaf/main/Main.java
+++ b/main/src/main/java/org/apache/karaf/main/Main.java
@@ -34,11 +34,13 @@ import java.security.Security;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.StringTokenizer;
+import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.apache.felix.utils.properties.Properties;
 import org.apache.karaf.info.ServerInfo;
+import org.apache.karaf.main.internal.Systemd;
 import org.apache.karaf.main.lock.Lock;
 import org.apache.karaf.main.lock.LockCallBack;
 import org.apache.karaf.main.lock.NoLock;
@@ -323,6 +325,7 @@ public class Main {
         }
         monitor();
         registerSignalHandler();
+        watchdog();
     }
 
     private void registerSignalHandler() {
@@ -404,7 +407,37 @@ public class Main {
     Lock getLock() {
         return lock;
     }
-    
+
+    private void watchdog() {
+        if(Boolean.getBoolean("karaf.systemd.enabled")) {
+            new Thread("Karaf Systemd Watchdog Thread") {
+                public void run() {
+                    try {
+                        doWatchdog();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }.start();
+        }
+    }
+
+    private void doWatchdog() throws Exception {
+        Systemd systemd = new Systemd();
+        long timeout = systemd.getWatchdogTimeout(TimeUnit.MILLISECONDS);
+
+        int code;
+        while (!exiting && timeout > 0) {
+            code = systemd.notifyWatchdog();
+            if(code < 0) {
+                System.err.println("Systemd sd_notify failed with error code: " + code);
+                break;
+            }
+
+            Thread.sleep(timeout / 2);
+        }
+    }
+
     private ClassLoader createClassLoader(ArtifactResolver resolver) throws Exception {
         List<URL> urls = new ArrayList<URL>();
         urls.add(resolver.resolve(config.frameworkBundle).toURL());

http://git-wip-us.apache.org/repos/asf/karaf/blob/020d255c/main/src/main/java/org/apache/karaf/main/internal/Systemd.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/internal/Systemd.java b/main/src/main/java/org/apache/karaf/main/internal/Systemd.java
new file mode 100644
index 0000000..888bc8b
--- /dev/null
+++ b/main/src/main/java/org/apache/karaf/main/internal/Systemd.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main.internal;
+
+
+import java.util.concurrent.TimeUnit;
+
+
+public class Systemd {
+    public static final String ENV_WATCHDOG_USEC = "WATCHDOG_USEC";
+    public static final String ENV_MAIN_PID = "SYSTEMD_MAIN_PID";
+
+    private final String mainPid;
+
+    public Systemd() {
+        this.mainPid = System.getProperty("karaf.systemd.main.pid", System.getenv(ENV_MAIN_PID));
+    }
+
+    public int notifyWatchdog() {
+        int rc = -1;
+
+        // WATCHDOG : tells the service manager to update the watchdog timestamp.
+        //            This is the keep-alive ping that services need to issue in
+        //            regular intervals if WatchdogSec= is enabled for it.
+        // MAINPID  : the main process ID (PID) of the service, in case the service
+        //            manager did not fork off the process itself. Example: "MAINPID=4711"
+        //            This does not seem to work reliably so used only if system
+        //            property karaf.systemd.main.pid or env variable SYSTEMD_MAIN_PID
+        //            are set (system property takes the precedence)
+        if(SystemdDaemon.INSTANCE != null) {
+            rc = SystemdDaemon.INSTANCE.sd_notify(
+                0,
+                (mainPid == null) ? "WATCHDOG=1" : ("MAINPID=" + mainPid + "\nWATCHDOG=1"));
+        }
+
+        return rc;
+    }
+
+    public long getWatchdogTimeout(TimeUnit timeUnit) {
+        String timeouts = System.getenv(ENV_WATCHDOG_USEC);
+        if(timeouts != null) {
+            long micros = Long.parseLong(timeouts);
+            return timeUnit.convert(micros, TimeUnit.MICROSECONDS);
+        }
+
+        return -1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/020d255c/main/src/main/java/org/apache/karaf/main/internal/SystemdDaemon.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/internal/SystemdDaemon.java b/main/src/main/java/org/apache/karaf/main/internal/SystemdDaemon.java
new file mode 100644
index 0000000..076cf1c
--- /dev/null
+++ b/main/src/main/java/org/apache/karaf/main/internal/SystemdDaemon.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main.internal;
+
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+
+
+public interface SystemdDaemon extends Library {
+    SystemdDaemon INSTANCE = (SystemdDaemon) Native.loadLibrary("systemd-daemon", SystemdDaemon.class);
+
+    int sd_notify(int unset_environment, String state);
+    int sd_notifyf(int unset_environment, String format, Object... args);
+
+    // Not available in all systemd version, should replace used of MAINPID
+    // int sd_pid_notify(int pid, int unset_environment, String state);
+    // int sd_pid_notifyff(int pid, int unset_environment, String format, Object... args);
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/020d255c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 6cb57d2..7f9002d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -144,7 +144,9 @@
         <asm.springsource.version>1.5.3</asm.springsource.version>
         <cglib.bundle.version>3.2.2_1</cglib.bundle.version>
         <cglib2.version>2.2.0</cglib2.version>
-
+        
+        <jna.version>4.2.2</jna.version>
+        
         <commons-beanutils.version>1.9.2</commons-beanutils.version>
         <commons-codec.version>1.10</commons-codec.version>
         <commons-compress.version>1.11</commons-compress.version>
@@ -1036,6 +1038,16 @@
                 <version>${felix.connect.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>net.java.dev.jna</groupId>
+                <artifactId>jna</artifactId>
+                <version>${jna.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>net.java.dev.jna</groupId>
+                <artifactId>jna-platform</artifactId>
+                <version>${jna.version}</version>
+            </dependency>
 
             <dependency>
                 <groupId>org.ow2.asm</groupId>