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

(cherry picked from commit 4b589e7cfa)

Conflicts:
	hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java

(cherry picked from commit 96f0813c5d6140aabe7b2837f30971936276e689)
This commit is contained in:
Jing Zhao 2015-01-09 17:35:57 -08:00 committed by Vinod Kumar Vavilapalli
parent e6b52fc3e9
commit c8ce11d067
3 changed files with 25 additions and 61 deletions

View File

@ -17,6 +17,8 @@ Release 2.6.1 - UNRELEASED
HDFS-7579. Improve log reporting during block report rpc failure. HDFS-7579. Improve log reporting during block report rpc failure.
(Charles Lamb via cnauroth) (Charles Lamb via cnauroth)
HDFS-7182. JMX metrics aren't accessible when NN is busy. (Ming Ma via jing9)
OPTIMIZATIONS OPTIMIZATIONS
BUG FIXES BUG FIXES

View File

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

View File

@ -17,11 +17,16 @@
*/ */
package org.apache.hadoop.hdfs.server.namenode; 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.lang.management.ManagementFactory;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServer; import javax.management.MBeanServer;
import javax.management.ObjectName; import javax.management.ObjectName;
@ -51,66 +56,28 @@ public class TestFSNamesystemMBean {
// come from hadoop metrics framework for the class FSNamesystem. // come from hadoop metrics framework for the class FSNamesystem.
ObjectName mxbeanNamefsn = new ObjectName( ObjectName mxbeanNamefsn = new ObjectName(
"Hadoop:service=NameNode,name=FSNamesystem"); "Hadoop:service=NameNode,name=FSNamesystem");
Integer blockCapacity = (Integer) (mbs.getAttribute(mxbeanNamefsn,
"BlockCapacity"));
// Metrics that belong to "FSNamesystemState". // Metrics that belong to "FSNamesystemState".
// These are metrics that FSNamesystem registers directly with MBeanServer. // These are metrics that FSNamesystem registers directly with MBeanServer.
ObjectName mxbeanNameFsns = new ObjectName( ObjectName mxbeanNameFsns = new ObjectName(
"Hadoop:service=NameNode,name=FSNamesystemState"); "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"));
// Metrics that belong to "NameNodeInfo". // Metrics that belong to "NameNodeInfo".
// These are metrics that FSNamesystem registers directly with MBeanServer. // These are metrics that FSNamesystem registers directly with MBeanServer.
ObjectName mxbeanNameNni = new ObjectName( ObjectName mxbeanNameNni = new ObjectName(
"Hadoop:service=NameNode,name=NameNodeInfo"); "Hadoop:service=NameNode,name=NameNodeInfo");
String safemode = (String) (mbs.getAttribute(mxbeanNameNni,
"Safemode")); final Set<ObjectName> mbeans = new HashSet<ObjectName>();
String liveNodes = (String) (mbs.getAttribute(mxbeanNameNni, mbeans.add(mxbeanNamefsn);
"LiveNodes")); mbeans.add(mxbeanNameFsns);
String deadNodes = (String) (mbs.getAttribute(mxbeanNameNni, mbeans.add(mxbeanNameNni);
"DeadNodes"));
String decomNodes = (String) (mbs.getAttribute(mxbeanNameNni, for(ObjectName mbean : mbeans) {
"DecomNodes")); MBeanInfo attributes = mbs.getMBeanInfo(mbean);
String corruptFiles = (String) (mbs.getAttribute(mxbeanNameNni, for (MBeanAttributeInfo attributeInfo : attributes.getAttributes()) {
"CorruptFiles")); mbs.getAttribute(mbean, attributeInfo.getName());
}
}
succeeded = true; succeeded = true;
} catch (Exception e) { } catch (Exception e) {