You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by cn...@apache.org on 2014/04/14 06:25:23 UTC
svn commit: r1587141 - in
/hadoop/common/trunk/hadoop-common-project/hadoop-common: ./
src/main/java/org/apache/hadoop/metrics2/
src/main/java/org/apache/hadoop/metrics2/impl/
src/main/java/org/apache/hadoop/metrics2/sink/
src/test/java/org/apache/hado...
Author: cnauroth
Date: Mon Apr 14 04:25:23 2014
New Revision: 1587141
URL: http://svn.apache.org/r1587141
Log:
HADOOP-10496. Metrics system FileSink can leak file descriptor. Contributed by Chris Nauroth.
Modified:
hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/MetricsSink.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/FileSink.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/sink/TestFileSink.java
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1587141&r1=1587140&r2=1587141&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/CHANGES.txt Mon Apr 14 04:25:23 2014
@@ -383,6 +383,8 @@ Release 2.5.0 - UNRELEASED
HADOOP-10495. TestFileUtil fails on Windows due to bad permission
assertions. (cnauroth)
+ HADOOP-10496. Metrics system FileSink can leak file descriptor. (cnauroth)
+
Release 2.4.1 - UNRELEASED
INCOMPATIBLE CHANGES
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/MetricsSink.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/MetricsSink.java?rev=1587141&r1=1587140&r2=1587141&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/MetricsSink.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/MetricsSink.java Mon Apr 14 04:25:23 2014
@@ -18,6 +18,8 @@
package org.apache.hadoop.metrics2;
+import java.io.Closeable;
+
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
@@ -26,7 +28,9 @@ import org.apache.hadoop.classification.
* Implementations of this interface consume the {@link MetricsRecord} generated
* from {@link MetricsSource}. It registers with {@link MetricsSystem} which
* periodically pushes the {@link MetricsRecord} to the sink using
- * {@link #putMetrics(MetricsRecord)} method.
+ * {@link #putMetrics(MetricsRecord)} method. If the implementing class also
+ * implements {@link Closeable}, then the MetricsSystem will close the sink when
+ * it is stopped.
*/
@InterfaceAudience.Public
@InterfaceStability.Evolving
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java?rev=1587141&r1=1587140&r2=1587141&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java Mon Apr 14 04:25:23 2014
@@ -18,6 +18,7 @@
package org.apache.hadoop.metrics2.impl;
+import java.io.Closeable;
import java.util.Random;
import java.util.concurrent.*;
@@ -25,6 +26,7 @@ import static com.google.common.base.Pre
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.metrics2.lib.MutableGaugeInt;
import org.apache.hadoop.metrics2.lib.MetricsRegistry;
import org.apache.hadoop.metrics2.lib.MutableCounterInt;
@@ -198,6 +200,9 @@ class MetricsSinkAdapter implements Sink
} catch (InterruptedException e) {
LOG.warn("Stop interrupted", e);
}
+ if (sink instanceof Closeable) {
+ IOUtils.cleanup(LOG, (Closeable)sink);
+ }
}
String name() {
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/FileSink.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/FileSink.java?rev=1587141&r1=1587140&r2=1587141&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/FileSink.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/FileSink.java Mon Apr 14 04:25:23 2014
@@ -18,8 +18,10 @@
package org.apache.hadoop.metrics2.sink;
+import java.io.Closeable;
import java.io.File;
import java.io.FileWriter;
+import java.io.IOException;
import java.io.PrintWriter;
import org.apache.commons.configuration.SubsetConfiguration;
@@ -36,7 +38,7 @@ import org.apache.hadoop.metrics2.Metric
*/
@InterfaceAudience.Public
@InterfaceStability.Evolving
-public class FileSink implements MetricsSink {
+public class FileSink implements MetricsSink, Closeable {
private static final String FILENAME_KEY = "filename";
private PrintWriter writer;
@@ -81,4 +83,9 @@ public class FileSink implements Metrics
public void flush() {
writer.flush();
}
+
+ @Override
+ public void close() throws IOException {
+ writer.close();
+ }
}
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/sink/TestFileSink.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/sink/TestFileSink.java?rev=1587141&r1=1587140&r2=1587141&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/sink/TestFileSink.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/sink/TestFileSink.java Mon Apr 14 04:25:23 2014
@@ -105,11 +105,18 @@ public class TestFileSink {
ms.publishMetricsNow(); // publish the metrics
ms.stop();
ms.shutdown();
-
- InputStream is = new FileInputStream(outFile);
- ByteArrayOutputStream baos = new ByteArrayOutputStream((int)outFile.length());
- IOUtils.copyBytes(is, baos, 1024, true);
- String outFileContent = new String(baos.toByteArray(), "UTF-8");
+
+ InputStream is = null;
+ ByteArrayOutputStream baos = null;
+ String outFileContent = null;
+ try {
+ is = new FileInputStream(outFile);
+ baos = new ByteArrayOutputStream((int)outFile.length());
+ IOUtils.copyBytes(is, baos, 1024, true);
+ outFileContent = new String(baos.toByteArray(), "UTF-8");
+ } finally {
+ IOUtils.cleanup(null, baos, is);
+ }
// Check the out file content. Should be something like the following:
//1360244820087 test1.testRecord1: Context=test1, testTag1=testTagValue1, testTag2=testTagValue2, Hostname=myhost, testMetric1=1, testMetric2=2