diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/AppLogAggregatorImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/AppLogAggregatorImpl.java index 20887b6..08376b5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/AppLogAggregatorImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/AppLogAggregatorImpl.java @@ -117,6 +117,7 @@ private final int retentionSize; private final long rollingMonitorInterval; private final NodeId nodeId; + private final AtomicBoolean waiting = new AtomicBoolean(false); private final Map containerLogAggregators = new HashMap(); @@ -392,6 +393,7 @@ private void doAppLogAggregation() { synchronized(this) { try { if (this.rollingMonitorInterval > 0) { + waiting.set(true); wait(this.rollingMonitorInterval * 1000); if (this.appFinishing.get() || this.aborted.get()) { break; @@ -507,7 +509,19 @@ public synchronized void abortLogAggregation() { @Private @VisibleForTesting + // This is only used for testing. + // This will wake the log aggregation thread that is waiting for + // rollingMonitorInterval. + // To use this method, make sure the log aggregation thread is running + // and waiting for rollingMonitorInterval. public synchronized void doLogAggregationOutOfBand() { + while(!waiting.get()) { + try { + wait(200); + } catch (InterruptedException e) { + // Do Nothing + } + } LOG.info("Do OutOfBand log aggregation"); this.notifyAll(); }