You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2015/09/12 14:54:48 UTC

svn commit: r1702629 - in /lucene/dev/branches/branch_5x: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java solr/core/src/test/org/apache/solr/handler/admin/SystemInfoHandlerTest.java

Author: uschindler
Date: Sat Sep 12 12:54:45 2015
New Revision: 1702629

URL: http://svn.apache.org/r1702629
Log:
Merged revision(s) 1702628 from lucene/dev/trunk:
LUCENE-6795: Improve SystemInfoHandler to get the bean directly instead of downcasting (thanks Peter Levart from jigsaw-dev), also more fixes with UOE thrown by RuntimeMXBean#getBootClassPath()

Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/handler/admin/SystemInfoHandlerTest.java

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java?rev=1702629&r1=1702628&r2=1702629&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java Sat Sep 12 12:54:45 2015
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.lang.management.ManagementFactory;
 import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.PlatformManagedObject;
 import java.lang.management.RuntimeMXBean;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -167,13 +168,17 @@ public class SystemInfoHandler extends R
     // This is a public Oracle/OpenJDK extension, but may not be in other JDKs:
     // com.sun.management.OperatingSystemMXBean
     try {
-      Class<?> intf = Class.forName("com.sun.management.OperatingSystemMXBean");
-      addGetterIfAvaliable( os, intf, "committedVirtualMemorySize", info);
-      addGetterIfAvaliable( os, intf, "freePhysicalMemorySize", info);
-      addGetterIfAvaliable( os, intf, "freeSwapSpaceSize", info);
-      addGetterIfAvaliable( os, intf, "processCpuTime", info);
-      addGetterIfAvaliable( os, intf, "totalPhysicalMemorySize", info);
-      addGetterIfAvaliable( os, intf, "totalSwapSpaceSize", info);
+      final Class<? extends PlatformManagedObject> intf = Class.forName("com.sun.management.OperatingSystemMXBean")
+          .asSubclass(PlatformManagedObject.class);
+      final PlatformManagedObject bean = ManagementFactory.getPlatformMXBean(intf);
+      if (bean != null) {
+        addMXBeanProperty( bean, intf, "committedVirtualMemorySize", info);
+        addMXBeanProperty( bean, intf, "freePhysicalMemorySize", info);
+        addMXBeanProperty( bean, intf, "freeSwapSpaceSize", info);
+        addMXBeanProperty( bean, intf, "processCpuTime", info);
+        addMXBeanProperty( bean, intf, "totalPhysicalMemorySize", info);
+        addMXBeanProperty( bean, intf, "totalSwapSpaceSize", info);
+      }
     } catch (Exception e) {
       // ignore
     }
@@ -181,9 +186,13 @@ public class SystemInfoHandler extends R
     // This is a public Oracle/OpenJDK extension, but may not be in other JDKs:
     // com.sun.management.UnixOperatingSystemMXBean
     try {
-      Class<?> intf = Class.forName("com.sun.management.UnixOperatingSystemMXBean");
-      addGetterIfAvaliable( os, intf, "openFileDescriptorCount", info );
-      addGetterIfAvaliable( os, intf, "maxFileDescriptorCount", info );
+      final Class<? extends PlatformManagedObject> intf = Class.forName("com.sun.management.UnixOperatingSystemMXBean")
+          .asSubclass(PlatformManagedObject.class);
+      final PlatformManagedObject bean = ManagementFactory.getPlatformMXBean(intf);
+      if (bean != null) {
+        addMXBeanProperty( bean, intf, "openFileDescriptorCount", info );
+        addMXBeanProperty( bean, intf, "maxFileDescriptorCount", info );
+      }
     } catch (Exception e) {
       // ignore
     }
@@ -201,24 +210,25 @@ public class SystemInfoHandler extends R
   }
   
   /**
-   * Try to run a getter function.  This is useful because java 1.6 has a few extra
-   * useful functions on the <code>OperatingSystemMXBean</code>
-   * 
-   * If you are running a sun jvm, there are nice functions in:
-   * UnixOperatingSystemMXBean and com.sun.management.OperatingSystemMXBean
-   * 
-   * it is package protected so it can be tested...
+   * Try to run a getter function on a {@link PlatformManagedObject}.
+   * <p>
+   * If you are running a OpenJDK/Oracle JVM, there are nice functions in:
+   * {@code com.sun.management.UnixOperatingSystemMXBean} and
+   * {@code com.sun.management.OperatingSystemMXBean}
+   * <p>
+   * If the given bean does not have the property, it is handled like {@code null}
+   * and not added to the given named list.
    */
-  static void addGetterIfAvaliable( Object obj, Class<?> intf, String property, NamedList<Object> info )
-  {
+  static void addMXBeanProperty(PlatformManagedObject obj, Class<? extends PlatformManagedObject> intf,
+      String property, NamedList<Object> info) {
     try {
-      String method = "get" + Character.toUpperCase( property.charAt(0) ) + property.substring( 1 );
-      Object v = intf.getMethod( method ).invoke( intf.cast(obj) );
+      final String method = "get" + Character.toUpperCase( property.charAt(0) ) + property.substring( 1 );
+      final Object v = intf.getMethod( method ).invoke( intf.cast(obj) );
       if( v != null ) {
         info.add( property, v );
       }
-    } catch( Exception ex ) {
-      // ignore
+    } catch (Exception e) {
+      log.warn("Cannot get property '{}' of MXBean interface: {}", property, intf.getName());
     }
   }
   
@@ -322,7 +332,9 @@ public class SystemInfoHandler extends R
     SimpleOrderedMap<Object> jmx = new SimpleOrderedMap<>();
     try{
       RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
-      jmx.add( "bootclasspath", mx.getBootClassPath());
+      if (mx.isBootClassPathSupported()) {
+        jmx.add( "bootclasspath", mx.getBootClassPath());
+      }
       jmx.add( "classpath", mx.getClassPath() );
 
       // the input arguments passed to the Java virtual machine

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/handler/admin/SystemInfoHandlerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/handler/admin/SystemInfoHandlerTest.java?rev=1702629&r1=1702628&r2=1702629&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/handler/admin/SystemInfoHandlerTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/handler/admin/SystemInfoHandlerTest.java Sat Sep 12 12:54:45 2015
@@ -36,11 +36,11 @@ public class SystemInfoHandlerTest exten
     info.add( "version", os.getVersion() );
     info.add( "arch", os.getArch() );
 
-    // make another using addGetterIfAvaliable 
+    // make another using addMXBeanProperty() 
     SimpleOrderedMap<Object> info2 = new SimpleOrderedMap<>();
-    SystemInfoHandler.addGetterIfAvaliable( os, OperatingSystemMXBean.class, "name", info2 );
-    SystemInfoHandler.addGetterIfAvaliable( os, OperatingSystemMXBean.class, "version", info2 );
-    SystemInfoHandler.addGetterIfAvaliable( os, OperatingSystemMXBean.class, "arch", info2 );
+    SystemInfoHandler.addMXBeanProperty( os, OperatingSystemMXBean.class, "name", info2 );
+    SystemInfoHandler.addMXBeanProperty( os, OperatingSystemMXBean.class, "version", info2 );
+    SystemInfoHandler.addMXBeanProperty( os, OperatingSystemMXBean.class, "arch", info2 );
     
     // make sure they got the same thing
     assertEquals( info.toString(), info2.toString() );