HADOOP-13159. Fix potential NPE in Metrics2 source for DecayRpcScheduler. Contributed by Xiaoyu Yao.

This commit is contained in:
Xiaoyu Yao 2016-05-17 14:57:51 -07:00
parent 0c6726e20d
commit 9478484845

View File

@ -206,11 +206,6 @@ public DecayRpcScheduler(int numLevels, String ns, Configuration conf) {
this.backOffResponseTimeThresholds = this.backOffResponseTimeThresholds =
parseBackOffResponseTimeThreshold(ns, conf, numLevels); parseBackOffResponseTimeThreshold(ns, conf, numLevels);
// Setup delay timer
Timer timer = new Timer();
DecayTask task = new DecayTask(this, timer);
timer.scheduleAtFixedRate(task, decayPeriodMillis, decayPeriodMillis);
// Setup response time metrics // Setup response time metrics
responseTimeTotalInCurrWindow = new AtomicLongArray(numLevels); responseTimeTotalInCurrWindow = new AtomicLongArray(numLevels);
responseTimeCountInCurrWindow = new AtomicLongArray(numLevels); responseTimeCountInCurrWindow = new AtomicLongArray(numLevels);
@ -223,6 +218,11 @@ public DecayRpcScheduler(int numLevels, String ns, Configuration conf) {
Preconditions.checkArgument(topUsersCount > 0, Preconditions.checkArgument(topUsersCount > 0,
"the number of top users for scheduler metrics must be at least 1"); "the number of top users for scheduler metrics must be at least 1");
// Setup delay timer
Timer timer = new Timer();
DecayTask task = new DecayTask(this, timer);
timer.scheduleAtFixedRate(task, decayPeriodMillis, decayPeriodMillis);
MetricsProxy prox = MetricsProxy.getInstance(ns, numLevels); MetricsProxy prox = MetricsProxy.getInstance(ns, numLevels);
prox.setDelegate(this); prox.setDelegate(this);
prox.registerMetrics2Source(ns); prox.registerMetrics2Source(ns);
@ -821,9 +821,10 @@ private void addTopNCallerSummary(MetricsRecordBuilder rb) {
final int topCallerCount = 10; final int topCallerCount = 10;
TopN topNCallers = getTopCallers(topCallerCount); TopN topNCallers = getTopCallers(topCallerCount);
Map<Object, Integer> decisions = scheduleCacheRef.get(); Map<Object, Integer> decisions = scheduleCacheRef.get();
for (int i=0; i < topNCallers.size(); i++) { final int actualCallerCount = topNCallers.size();
for (int i = 0; i < actualCallerCount; i++) {
NameValuePair entry = topNCallers.poll(); NameValuePair entry = topNCallers.poll();
String topCaller = "Top." + (topCallerCount - i) + "." + String topCaller = "Top." + (actualCallerCount - i) + "." +
"Caller(" + entry.getName() + ")"; "Caller(" + entry.getName() + ")";
String topCallerVolume = topCaller + ".Volume"; String topCallerVolume = topCaller + ".Volume";
String topCallerPriority = topCaller + ".Priority"; String topCallerPriority = topCaller + ".Priority";