You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by sh...@apache.org on 2017/01/12 16:47:30 UTC

incubator-unomi git commit: As Apache JIRA is down, this is a fix for on OutOfMemory : native thread limit reached problem because we were not properly closing or re-using the JMX connectors. This modification should fix the problem by re-using JMX conne

Repository: incubator-unomi
Updated Branches:
  refs/heads/master ddbebd25f -> e61412fc9


As Apache JIRA is down, this is a fix for on OutOfMemory : native thread limit reached problem because we were not properly closing or re-using the JMX connectors. This modification should fix the problem by re-using JMX connectors and storing them in a map where they are stored by URL. Upon the service shutdown all the connectors are closed. When a connector is used, it is first tested and if it fails it is removed from the map and a new one is created.

Signed-off-by: Serge Huber <sh...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/e61412fc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/e61412fc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/e61412fc

Branch: refs/heads/master
Commit: e61412fc90abc210d638c8b8cb848efd4be057a4
Parents: ddbebd2
Author: Serge Huber <sh...@apache.org>
Authored: Thu Jan 12 17:47:17 2017 +0100
Committer: Serge Huber <sh...@apache.org>
Committed: Thu Jan 12 17:47:17 2017 +0100

----------------------------------------------------------------------
 .../services/services/ClusterServiceImpl.java   | 62 ++++++++++++++------
 1 file changed, 44 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/e61412fc/services/src/main/java/org/apache/unomi/services/services/ClusterServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/ClusterServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/ClusterServiceImpl.java
index 8fb67d3..a002b55 100644
--- a/services/src/main/java/org/apache/unomi/services/services/ClusterServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/ClusterServiceImpl.java
@@ -70,6 +70,8 @@ public class ClusterServiceImpl implements ClusterService {
     private String secureAddress;
     private String securePort;
 
+    private Map<String,JMXConnector> jmxConnectors = new LinkedHashMap<>();
+
     PersistenceService persistenceService;
 
     public void setPersistenceService(PersistenceService persistenceService) {
@@ -178,6 +180,15 @@ public class ClusterServiceImpl implements ClusterService {
     }
 
     public void destroy() {
+        for (Map.Entry<String,JMXConnector> jmxConnectorEntry : jmxConnectors.entrySet()) {
+            String url = jmxConnectorEntry.getKey();
+            JMXConnector jmxConnector = jmxConnectorEntry.getValue();
+            try {
+                jmxConnector.close();
+            } catch (IOException e) {
+                logger.error("Error closing JMX connector for url {}", url, e);
+            }
+        }
     }
 
     @Override
@@ -224,32 +235,19 @@ public class ClusterServiceImpl implements ClusterService {
                 clusterNode.setData(false);
             }
             try {
-                // now let's connect to remote JMX service to retrieve information from the runtime and operating system MX beans
-                JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"+karafCellarNode.getHost() + ":"+karafJMXPort+"/karaf-root");
-                Map<String,Object> environment=new HashMap<String,Object>();
-                if (karafJMXUsername != null && karafJMXPassword != null) {
-                    environment.put(JMXConnector.CREDENTIALS,new String[]{karafJMXUsername,karafJMXPassword});
-                }
-                JMXConnector jmxc = JMXConnectorFactory.connect(url, environment);
-                MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
+                String serviceUrl = "service:jmx:rmi:///jndi/rmi://"+karafCellarNode.getHost() + ":"+karafJMXPort+"/karaf-root";
+                JMXConnector jmxConnector = getJMXConnector(serviceUrl);
+                MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();
                 final RuntimeMXBean remoteRuntime = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.RUNTIME_MXBEAN_NAME, RuntimeMXBean.class);
                 clusterNode.setUptime(remoteRuntime.getUptime());
                 ObjectName operatingSystemMXBeanName = new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME);
-                Double processCpuLoad = null;
                 Double systemCpuLoad = null;
                 try {
-                    processCpuLoad = (Double) mbsc.getAttribute(operatingSystemMXBeanName, "ProcessCpuLoad");
-                } catch (MBeanException e) {
-                    e.printStackTrace();
-                } catch (AttributeNotFoundException e) {
-                    e.printStackTrace();
-                }
-                try {
                     systemCpuLoad = (Double) mbsc.getAttribute(operatingSystemMXBeanName, "SystemCpuLoad");
                 } catch (MBeanException e) {
-                    e.printStackTrace();
+                    logger.error("Error retrieving system CPU load", e);
                 } catch (AttributeNotFoundException e) {
-                    e.printStackTrace();
+                    logger.error("Error retrieving system CPU load", e);
                 }
                 final OperatingSystemMXBean remoteOperatingSystemMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);
                 clusterNode.setLoadAverage(new double[] { remoteOperatingSystemMXBean.getSystemLoadAverage()});
@@ -301,4 +299,32 @@ public class ClusterServiceImpl implements ClusterService {
         return support.isAllowed(group, category, pid, type);
     }
 
+    private JMXConnector getJMXConnector(String url) throws IOException {
+        if (jmxConnectors.containsKey(url)) {
+            JMXConnector jmxConnector = jmxConnectors.get(url);
+            try {
+                jmxConnector.getMBeanServerConnection();
+                return jmxConnector;
+            } catch (IOException e) {
+                jmxConnectors.remove(url);
+                try {
+                    jmxConnector.close();
+                } catch (IOException e1) {
+                    logger.error("Error closing invalid JMX connection", e1);
+                }
+                logger.error("Error using the JMX connection to url {}, closed and will reconnect", url, e);
+            }
+        }
+        // if we reach this point either we didn't have a connector or it didn't validate
+        // now let's connect to remote JMX service to retrieve information from the runtime and operating system MX beans
+        JMXServiceURL jmxServiceURL = new JMXServiceURL(url);
+        Map<String,Object> environment=new HashMap<String,Object>();
+        if (karafJMXUsername != null && karafJMXPassword != null) {
+            environment.put(JMXConnector.CREDENTIALS,new String[]{karafJMXUsername,karafJMXPassword});
+        }
+        JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL, environment);
+        jmxConnectors.put(url, jmxConnector);
+        return jmxConnector;
+    }
+
 }