You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2012/10/18 18:43:43 UTC

svn commit: r1399734 - in /hbase/trunk/hbase-common: pom.xml src/main/java/org/apache/hadoop/hbase/util/OSMXBean.java

Author: tedyu
Date: Thu Oct 18 16:43:42 2012
New Revision: 1399734

URL: http://svn.apache.org/viewvc?rev=1399734&view=rev
Log:
HBASE-6965 Generic MXBean Utility class to support all JDK vendors (Kumar Ravi)


Added:
    hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/util/OSMXBean.java
Modified:
    hbase/trunk/hbase-common/pom.xml

Modified: hbase/trunk/hbase-common/pom.xml
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-common/pom.xml?rev=1399734&r1=1399733&r2=1399734&view=diff
==============================================================================
--- hbase/trunk/hbase-common/pom.xml (original)
+++ hbase/trunk/hbase-common/pom.xml Thu Oct 18 16:43:42 2012
@@ -70,6 +70,14 @@
       <groupId>commons-logging</groupId>
       <artifactId>commons-logging</artifactId>
     </dependency>
+     <dependency>
+       <groupId>org.slf4j</groupId>
+       <artifactId>slf4j-api</artifactId>
+     </dependency>
+     <dependency>
+       <groupId>org.slf4j</groupId>
+       <artifactId>slf4j-log4j12</artifactId>
+     </dependency>                                         
   </dependencies>
 
   <profiles>

Added: hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/util/OSMXBean.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/util/OSMXBean.java?rev=1399734&view=auto
==============================================================================
--- hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/util/OSMXBean.java (added)
+++ hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/util/OSMXBean.java Thu Oct 18 16:43:42 2012
@@ -0,0 +1,175 @@
+/**
+ * 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.hadoop.hbase.util;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.RuntimeMXBean;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.lang.reflect.Method;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+/**
+ * This class is a wrapper for the implementation of
+ * com.sun.management.UnixOperatingSystemMXBean
+ * It will decide to use Oracle Java api or its own implementation
+ * depending on the runtime (vendor) used.
+ */
+
+@InterfaceAudience.Public
+@InterfaceStability.Evolving
+public class OSMXBean {
+  static final Logger LOG = LoggerFactory.getLogger(OSMXBean.class);
+
+  private OperatingSystemMXBean osMbean;
+
+  private static final boolean ibmvendor =
+    System.getProperty("java.vendor").contains("IBM");
+  private static final boolean windows = 
+    System.getProperty("os.name").startsWith("Windows");
+  private static final boolean linux =
+    System.getProperty("os.name").startsWith("Linux");
+
+  /**
+   * Constructor. Get the running Operating System instance
+   */
+  public OSMXBean () {
+    this.osMbean = ManagementFactory.getOperatingSystemMXBean();
+  }
+ 
+  /**
+   * Check if the OS is unix. 
+   * 
+   * @return whether this is unix or not.
+   */
+  public boolean isUnix() {
+    if (windows) {
+      return false;
+    }
+    return (ibmvendor ? linux : true);
+  }
+
+  /**
+   * Load the implementation of UnixOperatingSystemMXBean for Oracle jvm
+   * and runs the desired method. 
+   * @param mBeanMethodName : method to run from the interface UnixOperatingSystemMXBean
+   * @return the method result
+   */
+  private Long runUnixMXBeanMethod (String mBeanMethodName)
+  {
+    Object unixos;
+    Class<?> classRef;
+    Method mBeanMethod;
+
+    try {
+      classRef = Class.forName("com.sun.management.UnixOperatingSystemMXBean");
+      if (classRef.isInstance(osMbean)) {
+        mBeanMethod = classRef.getDeclaredMethod(mBeanMethodName,
+          new Class[0]);
+        unixos = classRef.cast(osMbean);
+        return (Long)mBeanMethod.invoke(unixos);
+      }
+    }
+    catch(Exception e) {
+      LOG.warn("Not able to load class or method for com.sun.managment.UnixOperatingSystemMXBean.", e);
+    }
+    return null;
+  }
+
+  /**
+   * Get the number of opened filed descriptor for the runtime jvm.
+   * If Oracle java, it will use the com.sun.management interfaces.
+   * Otherwise, this methods implements it (linux only).  
+   * @return number of open file descriptors for the jvm
+   */
+  public long getOpenFileDescriptorCount() 
+  {
+    Long ofdc;
+    
+    if (!ibmvendor) {
+      ofdc = runUnixMXBeanMethod("getOpenFileDescriptorCount");
+      return (ofdc != null ? ofdc.longValue () : -1);
+    }
+    try {
+      //need to get the PID number of the process first
+      RuntimeMXBean rtmbean = ManagementFactory.getRuntimeMXBean();
+      String rtname = rtmbean.getName();
+      String[] pidhost = rtname.split("@");
+
+      //using linux bash commands to retrieve info
+      Process p = Runtime.getRuntime().exec(
+        new String[] { "bash", "-c",
+          "ls /proc/" + pidhost[0] + "/fdinfo | wc -l" });
+      InputStream in = p.getInputStream();
+      BufferedReader output = new BufferedReader(
+        new InputStreamReader(in));
+
+      String openFileDesCount;
+      if ((openFileDesCount = output.readLine()) != null) {
+        return Long.parseLong(openFileDesCount);
+      }
+    } catch (IOException ie) {
+      LOG.warn("Not able to get the number of open file descriptors", ie);
+    }
+    return -1;
+  }
+
+  /**
+   * Get the number of the maximum file descriptors the system can use.
+   * If Oracle java, it will use the com.sun.management interfaces.
+   * Otherwise, this methods implements it (linux only).  
+   * @return max number of file descriptors the operating system can use.
+   */
+  public long getMaxFileDescriptorCount()
+  {
+    Long mfdc;
+
+    if (!ibmvendor) {
+      mfdc = runUnixMXBeanMethod("getMaxFileDescriptorCount");
+      return (mfdc != null ? mfdc.longValue () : -1);
+    }
+    try {
+      
+      //using linux bash commands to retrieve info
+      Process p = Runtime.getRuntime().exec(
+        new String[] { "bash", "-c",
+        "ulimit -n" });
+      InputStream in = p.getInputStream();
+      BufferedReader output = new BufferedReader(
+        new InputStreamReader(in));
+
+      String maxFileDesCount;
+      if ((maxFileDesCount = output.readLine()) != null) {
+        return Long.parseLong(maxFileDesCount);
+      }
+    } catch (IOException ie) {
+      LOG.warn("Not able to get the max number of file descriptors", ie);
+    }
+    return -1;
+  }  
+}