YARN-2857. ConcurrentModificationException in ContainerLogAppender. Contributed by Mohammad Kamrul Islam
This commit is contained in:
parent
1a1dcce827
commit
f2fe8a800e
|
@ -87,6 +87,9 @@ Release 2.7.0 - UNRELEASED
|
||||||
YARN-2856. Fixed RMAppImpl to handle ATTEMPT_KILLED event at ACCEPTED state
|
YARN-2856. Fixed RMAppImpl to handle ATTEMPT_KILLED event at ACCEPTED state
|
||||||
on app recovery. (Rohith Sharmaks via jianhe)
|
on app recovery. (Rohith Sharmaks via jianhe)
|
||||||
|
|
||||||
|
YARN-2857. ConcurrentModificationException in ContainerLogAppender
|
||||||
|
(Mohammad Kamrul Islam via jlowe)
|
||||||
|
|
||||||
Release 2.6.0 - 2014-11-18
|
Release 2.6.0 - 2014-11-18
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -41,6 +41,7 @@ public class ContainerLogAppender extends FileAppender
|
||||||
//so that log4j can configure it from the configuration(log4j.properties).
|
//so that log4j can configure it from the configuration(log4j.properties).
|
||||||
private int maxEvents;
|
private int maxEvents;
|
||||||
private Queue<LoggingEvent> tail = null;
|
private Queue<LoggingEvent> tail = null;
|
||||||
|
private boolean closing = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void activateOptions() {
|
public void activateOptions() {
|
||||||
|
@ -57,6 +58,9 @@ public class ContainerLogAppender extends FileAppender
|
||||||
@Override
|
@Override
|
||||||
public void append(LoggingEvent event) {
|
public void append(LoggingEvent event) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
if (closing) { // When closing drop any new/transitive CLA appending
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (tail == null) {
|
if (tail == null) {
|
||||||
super.append(event);
|
super.append(event);
|
||||||
} else {
|
} else {
|
||||||
|
@ -77,8 +81,9 @@ public class ContainerLogAppender extends FileAppender
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void close() {
|
public synchronized void close() {
|
||||||
|
closing = true;
|
||||||
if (tail != null) {
|
if (tail != null) {
|
||||||
for(LoggingEvent event: tail) {
|
for (LoggingEvent event : tail) {
|
||||||
super.append(event);
|
super.append(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hadoop.yarn;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.apache.log4j.PatternLayout;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestContainerLogAppender {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAppendInClose() throws Exception {
|
||||||
|
final ContainerLogAppender claAppender = new ContainerLogAppender();
|
||||||
|
claAppender.setName("testCLA");
|
||||||
|
claAppender.setLayout(new PatternLayout("%-5p [%t]: %m%n"));
|
||||||
|
claAppender.setContainerLogDir("target/testAppendInClose/logDir");
|
||||||
|
claAppender.setTotalLogFileSize(1000);
|
||||||
|
claAppender.activateOptions();
|
||||||
|
final Logger claLog = Logger.getLogger("testAppendInClose-catergory");
|
||||||
|
claLog.setAdditivity(false);
|
||||||
|
claLog.addAppender(claAppender);
|
||||||
|
claLog.info(new Object() {
|
||||||
|
public String toString() {
|
||||||
|
claLog.info("message1");
|
||||||
|
return "return message1";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
claAppender.close();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue