Skip to content

Commit 2e58501

Browse files
authored
Fix flaky ReactiveWebServerLoadBalancerInteropTest (#5999)
Motivation: ``` com.linecorp.armeria.spring.web.reactive.ReactiveWebServerLoadBalancerInteropTest.[1] sessionProtocol=H1C, path=/controller/api/ping java.util.ConcurrentModificationException at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1714) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at com.linecorp.armeria.spring.web.reactive.ReactiveWebServerLoadBalancerInteropTest.assertNoErrorLogByHttpWebHandlerAdapter(ReactiveWebServerLoadBalancerInteropTest.java:148) ``` It seems that `logAppender.list` was modified while retrieving elements Modifications: - Use `CopyOnWriteArrayList` to collect `ILoggingEvent` Result: Fixes #5462
1 parent 6963c92 commit 2e58501

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

spring/boot3-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ReactiveWebServerLoadBalancerInteropTest.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
2323
import static org.springframework.web.reactive.function.server.ServerResponse.ok;
2424

25+
import java.util.List;
26+
import java.util.concurrent.CopyOnWriteArrayList;
2527
import java.util.stream.Collectors;
2628

2729
import org.junit.jupiter.api.AfterEach;
@@ -50,7 +52,7 @@
5052

5153
import ch.qos.logback.classic.Logger;
5254
import ch.qos.logback.classic.spi.ILoggingEvent;
53-
import ch.qos.logback.core.read.ListAppender;
55+
import ch.qos.logback.core.AppenderBase;
5456
import reactor.core.publisher.Mono;
5557

5658
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@@ -79,7 +81,7 @@ RouterFunction<ServerResponse> routerFunction() {
7981
int port;
8082

8183
final Logger httpWebHandlerAdapterLogger = (Logger) LoggerFactory.getLogger(HttpWebHandlerAdapter.class);
82-
final ListAppender<ILoggingEvent> logAppender = new ListAppender<>();
84+
final ConcurrentListAppender<ILoggingEvent> logAppender = new ConcurrentListAppender<>();
8385

8486
@BeforeEach
8587
public void attachAppender() {
@@ -148,4 +150,14 @@ private void assertNoErrorLogByHttpWebHandlerAdapter() {
148150
.collect(Collectors.toList()))
149151
.isEmpty();
150152
}
153+
154+
private static final class ConcurrentListAppender<E> extends AppenderBase<E> {
155+
156+
List<E> list = new CopyOnWriteArrayList<>();
157+
158+
@Override
159+
protected void append(E eventObject) {
160+
list.add(eventObject);
161+
}
162+
}
151163
}

0 commit comments

Comments
 (0)