diff --git a/test/framework/src/main/java/org/elasticsearch/test/MockLogAppender.java b/test/framework/src/main/java/org/elasticsearch/test/MockLogAppender.java index ccb010e2a915e..22a12e74c3516 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/MockLogAppender.java +++ b/test/framework/src/main/java/org/elasticsearch/test/MockLogAppender.java @@ -24,8 +24,8 @@ import org.apache.logging.log4j.core.filter.RegexFilter; import org.elasticsearch.common.regex.Regex; -import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.regex.Pattern; import static org.hamcrest.CoreMatchers.equalTo; @@ -42,7 +42,12 @@ public class MockLogAppender extends AbstractAppender { public MockLogAppender() throws IllegalAccessException { super("mock", RegexFilter.createFilter(".*(\n.*)*", new String[0], false, null, null), null); - expectations = new ArrayList<>(); + /* + * We use a copy-on-write array list since log messages could be appended while we are setting up expectations. When that occurs, + * we would run into a concurrent modification exception from the iteration over the expectations in #append, concurrent with a + * modification from #addExpectation. + */ + expectations = new CopyOnWriteArrayList<>(); } public void addExpectation(LoggingExpectation expectation) { diff --git a/test/framework/src/main/java/org/elasticsearch/transport/AbstractSimpleTransportTestCase.java b/test/framework/src/main/java/org/elasticsearch/transport/AbstractSimpleTransportTestCase.java index 3fddc27297b1d..960d25c960946 100644 --- a/test/framework/src/main/java/org/elasticsearch/transport/AbstractSimpleTransportTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/transport/AbstractSimpleTransportTestCase.java @@ -993,7 +993,6 @@ public void handleException(TransportException exp) { } @TestLogging(value = "org.elasticsearch.transport.TransportService.tracer:trace") - @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/40586") public void testTracerLog() throws Exception { TransportRequestHandler handler = (request, channel, task) -> channel.sendResponse(new StringMessageResponse("")); TransportRequestHandler handlerWithError = (request, channel, task) -> {