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
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.

View File

@ -410,7 +410,7 @@ private void logAuditEvent(boolean succeeded,
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
@ -7235,16 +7235,11 @@ public void setNeedRollbackFsImage(boolean needRollbackFsImage) {
@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? */

View File

@ -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 void run() {
// 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) {