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

This commit is contained in:
Jing Zhao 2015-01-09 17:35:57 -08:00
parent d847363821
commit 4b589e7cfa
3 changed files with 25 additions and 63 deletions

View File

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

View File

@ -410,7 +410,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
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
@ -7235,16 +7235,11 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
@Override // NameNodeMXBean @Override // NameNodeMXBean
public RollingUpgradeInfo.Bean getRollingUpgradeStatus() { public RollingUpgradeInfo.Bean getRollingUpgradeStatus() {
readLock();
try {
RollingUpgradeInfo upgradeInfo = getRollingUpgradeInfo(); RollingUpgradeInfo upgradeInfo = getRollingUpgradeInfo();
if (upgradeInfo != null) { if (upgradeInfo != null) {
return new RollingUpgradeInfo.Bean(upgradeInfo); return new RollingUpgradeInfo.Bean(upgradeInfo);
} }
return null; return null;
} finally {
readUnlock();
}
} }
/** 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,68 +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"));
String topUsers =
(String) (mbs.getAttribute(mxbeanNameFsns, "TopUserOpCounts"));
// 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) {