Return-Path: X-Original-To: apmail-hadoop-common-commits-archive@www.apache.org Delivered-To: apmail-hadoop-common-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BE8E018419 for ; Wed, 5 Aug 2015 23:14:47 +0000 (UTC) Received: (qmail 20851 invoked by uid 500); 5 Aug 2015 23:14:44 -0000 Delivered-To: apmail-hadoop-common-commits-archive@hadoop.apache.org Received: (qmail 20786 invoked by uid 500); 5 Aug 2015 23:14:44 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: common-dev@hadoop.apache.org Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 20777 invoked by uid 99); 5 Aug 2015 23:14:44 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 05 Aug 2015 23:14:44 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 6A571E03CD; Wed, 5 Aug 2015 23:14:44 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jianhe@apache.org To: common-commits@hadoop.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: hadoop git commit: HADOOP-11932. MetricsSinkAdapter may hang when being stopped. Contributed by Brahma Reddy Battula (cherry picked from commit f59612edd74d1bef2b60870c24c1f67c56b2b3cb) Date: Wed, 5 Aug 2015 23:14:44 +0000 (UTC) Repository: hadoop Updated Branches: refs/heads/branch-2.7 015d86836 -> c170f58a5 HADOOP-11932. MetricsSinkAdapter may hang when being stopped. Contributed by Brahma Reddy Battula (cherry picked from commit f59612edd74d1bef2b60870c24c1f67c56b2b3cb) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/c170f58a Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/c170f58a Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/c170f58a Branch: refs/heads/branch-2.7 Commit: c170f58a59fd9b387909cba9203184530a67e545 Parents: 015d868 Author: Jian He Authored: Wed Aug 5 16:12:45 2015 -0700 Committer: Jian He Committed: Wed Aug 5 16:14:35 2015 -0700 ---------------------------------------------------------------------- hadoop-common-project/hadoop-common/CHANGES.txt | 3 + .../metrics2/impl/MetricsSinkAdapter.java | 6 +- .../metrics2/impl/TestMetricsSystemImpl.java | 60 ++++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c170f58a/hadoop-common-project/hadoop-common/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index fba4ccc..f3f2d41 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -26,6 +26,9 @@ Release 2.7.2 - UNRELEASED HADOOP-12304. Applications using FileContext fail with the default file system configured to be wasb/s3/etc. (cnauroth) + HADOOP-11932. MetricsSinkAdapter may hang when being stopped. + (Brahma Reddy Battula via jianhe) + Release 2.7.1 - 2015-07-06 INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/c170f58a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java index 478c316..62498ea 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSinkAdapter.java @@ -209,15 +209,15 @@ class MetricsSinkAdapter implements SinkQueue.Consumer { void stop() { stopping = true; sinkThread.interrupt(); + if (sink instanceof Closeable) { + IOUtils.cleanup(LOG, (Closeable)sink); + } try { sinkThread.join(); } catch (InterruptedException e) { LOG.warn("Stop interrupted", e); } - if (sink instanceof Closeable) { - IOUtils.cleanup(LOG, (Closeable)sink); - } } String name() { http://git-wip-us.apache.org/repos/asf/hadoop/blob/c170f58a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java index 0f7b15f..6238d79 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestMetricsSystemImpl.java @@ -18,6 +18,8 @@ package org.apache.hadoop.metrics2.impl; +import java.io.Closeable; +import java.io.IOException; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; @@ -484,6 +486,64 @@ public class TestMetricsSystemImpl { } } + /** + * Class to verify HADOOP-11932. Instead of reading from HTTP, going in loop + * until closed. + */ + private static class TestClosableSink implements MetricsSink, Closeable { + + boolean closed = false; + CountDownLatch collectingLatch; + + public TestClosableSink(CountDownLatch collectingLatch) { + this.collectingLatch = collectingLatch; + } + + @Override + public void init(SubsetConfiguration conf) { + } + + @Override + public void close() throws IOException { + closed = true; + } + + @Override + public void putMetrics(MetricsRecord record) { + while (!closed) { + collectingLatch.countDown(); + } + } + + @Override + public void flush() { + } + } + + /** + * HADOOP-11932 + */ + @Test(timeout = 5000) + public void testHangOnSinkRead() throws Exception { + new ConfigBuilder().add("*.period", 8) + .add("test.sink.test.class", TestSink.class.getName()) + .save(TestMetricsConfig.getTestFilename("hadoop-metrics2-test")); + MetricsSystemImpl ms = new MetricsSystemImpl("Test"); + ms.start(); + try { + CountDownLatch collectingLatch = new CountDownLatch(1); + MetricsSink sink = new TestClosableSink(collectingLatch); + ms.registerSink("closeableSink", + "The sink will be used to test closeability", sink); + // trigger metric collection first time + ms.onTimerEvent(); + // Make sure that sink is collecting metrics + assertTrue(collectingLatch.await(1, TimeUnit.SECONDS)); + } finally { + ms.stop(); + } + } + @Metrics(context="test") private static class TestSource { @Metric("C1 desc") MutableCounterLong c1;