From 1a3f1482e2738c7f9a983bc55189116930388d7b Mon Sep 17 00:00:00 2001 From: Karthik Kambatla Date: Tue, 26 Apr 2016 06:15:36 -0700 Subject: [PATCH] YARN-4795. ContainerMetrics drops records. (Daniel Templeton via kasha) --- .../monitor/ContainerMetrics.java | 15 +++++---------- .../monitor/TestContainerMetrics.java | 7 ++++--- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainerMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainerMetrics.java index f85431ee0bb..d59abdaa2b1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainerMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainerMetrics.java @@ -121,11 +121,10 @@ public class ContainerMetrics implements MetricsSource { final MetricsSystem metricsSystem; // Metrics publishing status - private long flushPeriodMs; + private final long flushPeriodMs; + private final long unregisterDelayMs; private boolean flushOnPeriod = false; // true if period elapsed private boolean finished = false; // true if container finished - private boolean unregister = false; // unregister - private long unregisterDelayMs; private Timer timer; // lazily initialized /** @@ -227,17 +226,11 @@ public class ContainerMetrics implements MetricsSource { @Override public synchronized void getMetrics(MetricsCollector collector, boolean all) { //Container goes through registered -> finished -> unregistered. - if (unregister) { - return; - } - if (finished || flushOnPeriod) { registry.snapshot(collector.addRecord(registry.info()), all); } - if (finished) { - this.unregister = true; - } else if (flushOnPeriod) { + if (!finished && flushOnPeriod) { flushOnPeriod = false; scheduleTimerTaskIfRequired(); } @@ -301,6 +294,7 @@ public class ContainerMetrics implements MetricsSource { if (timer == null) { this.timer = new Timer("Metrics flush checker", true); } + TimerTask timerTask = new TimerTask() { @Override public void run() { @@ -311,6 +305,7 @@ public class ContainerMetrics implements MetricsSource { } } }; + timer.schedule(timerTask, flushPeriodMs); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/TestContainerMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/TestContainerMetrics.java index fb482c495ec..60f6604259f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/TestContainerMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/TestContainerMetrics.java @@ -77,11 +77,12 @@ public class TestContainerMetrics { collector.clear(); metrics.getMetrics(collector, true); - assertEquals(ERR, 0, collector.getRecords().size()); + assertEquals(ERR, 1, collector.getRecords().size()); + collector.clear(); Thread.sleep(110); metrics.getMetrics(collector, true); - assertEquals(ERR, 0, collector.getRecords().size()); + assertEquals(ERR, 1, collector.getRecords().size()); } @Test @@ -134,7 +135,7 @@ public class TestContainerMetrics { public void testContainerMetricsFinished() throws InterruptedException { MetricsSystemImpl system = new MetricsSystemImpl(); system.init("test"); - MetricsCollectorImpl collector = new MetricsCollectorImpl(); + ApplicationId appId = ApplicationId.newInstance(1234, 3); ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(appId, 4);