diff --git 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 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 9d17db0..ca519d6 100644 --- 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 +++ 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 @@ -112,11 +112,10 @@ 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 /** @@ -218,17 +217,11 @@ synchronized static void unregisterContainerMetrics(ContainerMetrics cm) { @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(); } @@ -283,6 +276,7 @@ private synchronized void scheduleTimerTaskIfRequired() { if (timer == null) { this.timer = new Timer("Metrics flush checker", true); } + TimerTask timerTask = new TimerTask() { @Override public void run() { @@ -293,6 +287,7 @@ public void run() { } } }; + timer.schedule(timerTask, flushPeriodMs); } } diff --git 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 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 fb482c4..60f6604 100644 --- 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 +++ 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 void testContainerMetricsFlow() throws InterruptedException { 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 void testContainerMetricsLimit() throws InterruptedException { 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);