Browse Source

HDFS-7182. JMX metrics aren't accessible when NN is busy. Contributed by Ming Ma.

Jing Zhao 10 years ago
parent
commit
2a06101e61

+ 2 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -485,6 +485,8 @@ Release 2.7.0 - UNRELEASED
     HADOOP-11470. Remove some uses of obsolete guava APIs from the hadoop
     codebase. (Sangjin Lee via Colin P. McCabe)
 
+    HDFS-7182. JMX metrics aren't accessible when NN is busy. (Ming Ma via jing9)
+
   OPTIMIZATIONS
 
     HDFS-7454. Reduce memory footprint for AclEntries in NameNode.

+ 5 - 10
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java

@@ -422,7 +422,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
 
   private String nameserviceId;
 
-  private RollingUpgradeInfo rollingUpgradeInfo = null;
+  private volatile RollingUpgradeInfo rollingUpgradeInfo = null;
   /**
    * A flag that indicates whether the checkpointer should checkpoint a rollback
    * fsimage. The edit log tailer sets this flag. The checkpoint will create a
@@ -7236,16 +7236,11 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
 
   @Override  // NameNodeMXBean
   public RollingUpgradeInfo.Bean getRollingUpgradeStatus() {
-    readLock();
-    try {
-      RollingUpgradeInfo upgradeInfo = getRollingUpgradeInfo();
-      if (upgradeInfo != null) {
-        return new RollingUpgradeInfo.Bean(upgradeInfo);
-      }
-      return null;
-    } finally {
-      readUnlock();
+    RollingUpgradeInfo upgradeInfo = getRollingUpgradeInfo();
+    if (upgradeInfo != null) {
+      return new RollingUpgradeInfo.Bean(upgradeInfo);
     }
+    return null;
   }
 
   /** Is rolling upgrade in progress? */

+ 18 - 53
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java

@@ -17,11 +17,16 @@
  */
 package org.apache.hadoop.hdfs.server.namenode;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
 
 import java.lang.management.ManagementFactory;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
@@ -51,68 +56,28 @@ public class TestFSNamesystemMBean {
         // come from hadoop metrics framework for the class FSNamesystem.
         ObjectName mxbeanNamefsn = new ObjectName(
             "Hadoop:service=NameNode,name=FSNamesystem");
-        Integer blockCapacity = (Integer) (mbs.getAttribute(mxbeanNamefsn,
-            "BlockCapacity"));
 
         // Metrics that belong to "FSNamesystemState".
         // These are metrics that FSNamesystem registers directly with MBeanServer.
         ObjectName mxbeanNameFsns = new ObjectName(
             "Hadoop:service=NameNode,name=FSNamesystemState");
-        String FSState = (String) (mbs.getAttribute(mxbeanNameFsns,
-            "FSState"));
-        Long blocksTotal = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "BlocksTotal"));
-        Long capacityTotal = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "CapacityTotal"));
-        Long capacityRemaining = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "CapacityRemaining"));
-        Long capacityUsed = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "CapacityUsed"));
-        Long filesTotal = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "FilesTotal"));
-        Long pendingReplicationBlocks = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "PendingReplicationBlocks"));
-        Long underReplicatedBlocks = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "UnderReplicatedBlocks"));
-        Long scheduledReplicationBlocks = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "ScheduledReplicationBlocks"));
-        Integer totalLoad = (Integer) (mbs.getAttribute(mxbeanNameFsns,
-            "TotalLoad"));
-        Integer numLiveDataNodes = (Integer) (mbs.getAttribute(mxbeanNameFsns,
-            "NumLiveDataNodes"));
-        Integer numDeadDataNodes = (Integer) (mbs.getAttribute(mxbeanNameFsns,
-           "NumDeadDataNodes"));
-        Integer numStaleDataNodes = (Integer) (mbs.getAttribute(mxbeanNameFsns,
-            "NumStaleDataNodes"));
-        Integer numDecomLiveDataNodes = (Integer) (mbs.getAttribute(mxbeanNameFsns,
-            "NumDecomLiveDataNodes"));
-        Integer numDecomDeadDataNodes = (Integer) (mbs.getAttribute(mxbeanNameFsns,
-            "NumDecomDeadDataNodes"));
-        Integer numDecommissioningDataNodes = (Integer) (mbs.getAttribute(mxbeanNameFsns,
-            "NumDecommissioningDataNodes"));
-        String snapshotStats = (String) (mbs.getAttribute(mxbeanNameFsns,
-            "SnapshotStats"));
-        Long MaxObjects = (Long) (mbs.getAttribute(mxbeanNameFsns,
-            "MaxObjects"));
-        Integer numStaleStorages = (Integer) (mbs.getAttribute(
-            mxbeanNameFsns, "NumStaleStorages"));
-        String topUsers =
-            (String) (mbs.getAttribute(mxbeanNameFsns, "TopUserOpCounts"));
 
         // Metrics that belong to "NameNodeInfo".
         // These are metrics that FSNamesystem registers directly with MBeanServer.
         ObjectName mxbeanNameNni = new ObjectName(
             "Hadoop:service=NameNode,name=NameNodeInfo");
-        String safemode = (String) (mbs.getAttribute(mxbeanNameNni,
-            "Safemode"));
-        String liveNodes = (String) (mbs.getAttribute(mxbeanNameNni,
-            "LiveNodes"));
-        String deadNodes = (String) (mbs.getAttribute(mxbeanNameNni,
-            "DeadNodes"));
-        String decomNodes = (String) (mbs.getAttribute(mxbeanNameNni,
-            "DecomNodes"));
-        String corruptFiles = (String) (mbs.getAttribute(mxbeanNameNni,
-            "CorruptFiles"));
+
+        final Set<ObjectName> mbeans = new HashSet<ObjectName>();
+        mbeans.add(mxbeanNamefsn);
+        mbeans.add(mxbeanNameFsns);
+        mbeans.add(mxbeanNameNni);
+
+        for(ObjectName mbean : mbeans) {
+          MBeanInfo attributes = mbs.getMBeanInfo(mbean);
+          for (MBeanAttributeInfo attributeInfo : attributes.getAttributes()) {
+            mbs.getAttribute(mbean, attributeInfo.getName());
+          }
+        }
 
         succeeded = true;
       } catch (Exception e) {