From 2a06101e61f2f7a08913c2367d9dbefb910e64a7 Mon Sep 17 00:00:00 2001 From: Jing Zhao Date: Fri, 9 Jan 2015 17:35:57 -0800 Subject: [PATCH] HDFS-7182. JMX metrics aren't accessible when NN is busy. Contributed by Ming Ma. --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 2 + .../hdfs/server/namenode/FSNamesystem.java | 15 ++-- .../namenode/TestFSNamesystemMBean.java | 71 +++++-------------- 3 files changed, 25 insertions(+), 63 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index b9704a2c573..c8500a40759 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/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. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 0e25189d114..36a43347566 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/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? */ diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java index 3703c2dcba4..c044fb0cff1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java +++ b/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 mbeans = new HashSet(); + 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) {