Browse Source

HADOOP-3085. Catch Exception in metrics util classes to ensure that
misconfigured metrics don't prevent others from updating. (cdouglas)



git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/trunk@653638 13f79535-47bb-0310-9956-ffa450edef68

Christopher Douglas 17 years ago
parent
commit
4b112be02c

+ 3 - 0
CHANGES.txt

@@ -165,6 +165,9 @@ Trunk (unreleased changes)
     HADOOP-2930. Make {start,stop}-balancer.sh work even if hadoop-daemon.sh
     is not in the PATH. (Spiros Papadimitriou via hairong)
 
+    HADOOP-3085. Catch Exception in metrics util classes to ensure that
+    misconfigured metrics don't prevent others from updating. (cdouglas)
+
 Release 0.17.0 - Unreleased
 
   INCOMPATIBLE CHANGES

+ 15 - 2
src/java/org/apache/hadoop/metrics/util/MetricsIntValue.java

@@ -18,7 +18,10 @@
 package org.apache.hadoop.metrics.util;
 
 import org.apache.hadoop.metrics.MetricsRecord;
+import org.apache.hadoop.util.StringUtils;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * The MetricsIntValue class is for a metric that is not time varied
@@ -28,6 +31,10 @@ import org.apache.hadoop.metrics.MetricsRecord;
  *
  */
 public class MetricsIntValue {  
+
+  protected static final Log LOG =
+    LogFactory.getLog("org.apache.hadoop.metrics.util");
+
   private String name;
   private int value;
   private boolean changed;
@@ -69,8 +76,14 @@ public class MetricsIntValue {
    * @param mr
    */
   public synchronized void pushMetric(final MetricsRecord mr) {
-    if (changed) 
-      mr.incrMetric(name, value);
+    if (changed) {
+      try {
+        mr.incrMetric(name, value);
+      } catch (Exception e) {
+        LOG.info("pushMetric failed for " + name + "\n" +
+            StringUtils.stringifyException(e));
+      }
+    }
     changed = false;
   }
 }

+ 12 - 1
src/java/org/apache/hadoop/metrics/util/MetricsTimeVaryingInt.java

@@ -18,6 +18,10 @@
 package org.apache.hadoop.metrics.util;
 
 import org.apache.hadoop.metrics.MetricsRecord;
+import org.apache.hadoop.util.StringUtils;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * The MetricsTimeVaryingInt class is for a metric that naturally
@@ -30,6 +34,8 @@ import org.apache.hadoop.metrics.MetricsRecord;
  */
 public class MetricsTimeVaryingInt {
 
+  protected static final Log LOG =
+    LogFactory.getLog("org.apache.hadoop.metrics.util");
   
   private String name;
   private int currentValue;
@@ -76,7 +82,12 @@ public class MetricsTimeVaryingInt {
    */
   public synchronized void pushMetric(final MetricsRecord mr) {
     intervalHeartBeat();
-    mr.incrMetric(name, getPreviousIntervalValue());
+    try {
+      mr.incrMetric(name, getPreviousIntervalValue());
+    } catch (Exception e) {
+      LOG.info("pushMetric failed for " + name + "\n" +
+          StringUtils.stringifyException(e));
+    }
   }
   
   

+ 14 - 2
src/java/org/apache/hadoop/metrics/util/MetricsTimeVaryingRate.java

@@ -18,6 +18,10 @@
 package org.apache.hadoop.metrics.util;
 
 import org.apache.hadoop.metrics.MetricsRecord;
+import org.apache.hadoop.util.StringUtils;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * The MetricsTimeVaryingRate class is for a rate based metric that
@@ -30,6 +34,9 @@ import org.apache.hadoop.metrics.MetricsRecord;
  */
 public class MetricsTimeVaryingRate {
 
+  protected static final Log LOG =
+    LogFactory.getLog("org.apache.hadoop.metrics.util");
+
   static class Metrics {
     int numOperations = 0;
     long time = 0;  // total time or average time
@@ -125,8 +132,13 @@ public class MetricsTimeVaryingRate {
    */
   public synchronized void pushMetric(final MetricsRecord mr) {
     intervalHeartBeat();
-    mr.incrMetric(name + "_num_ops", getPreviousIntervalNumOps());
-    mr.incrMetric(name + "_avg_time", (int)getPreviousIntervalAverageTime());
+    try {
+      mr.incrMetric(name + "_num_ops", getPreviousIntervalNumOps());
+      mr.incrMetric(name + "_avg_time", getPreviousIntervalNumOps());
+    } catch (Exception e) {
+      LOG.info("pushMetric failed for " + name + "\n" +
+          StringUtils.stringifyException(e));
+    }
   }
   
   /**