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