-
Notifications
You must be signed in to change notification settings - Fork 188
Description
Description of the bug
When interacting with the UI over multiple threads, the UiInternals class sometimes throws ConcurrentModificationExceptions. These even occur within the access/accessSyncronously Methods (first and second stacktrace).
Stacktrace 1:
java.util.ConcurrentModificationException: null at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:1023) at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:1046) at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1950) at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:632) at com.vaadin.flow.component.internal.UIInternals.isDirty(UIInternals.java:1268) at com.vaadin.flow.component.UI.push(UI.java:757) at com.vaadin.flow.server.VaadinSession.unlock(VaadinSession.java:769) at com.vaadin.flow.server.VaadinSession.accessSynchronously(VaadinSession.java:1020)
Stacktrace 2:
java.util.ConcurrentModificationException: null at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:1023) at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:1046) at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1950) at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:632) at com.vaadin.flow.component.internal.UIInternals.isDirty(UIInternals.java:1268) at com.vaadin.flow.component.UI.push(UI.java:757) at com.vaadin.flow.server.VaadinSession.unlock(VaadinSession.java:769) at com.vaadin.flow.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:2352) at com.vaadin.flow.server.VaadinService.accessSession(VaadinService.java:2319) at com.vaadin.flow.server.VaadinSession.access(VaadinSession.java:1065) at com.vaadin.flow.component.UI.access(UI.java:574) at com.vaadin.flow.component.UI.access(UI.java:557)
Stacktrace 3:
java.util.ConcurrentModificationException: null at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:1023) at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:1046) at java.lang.Iterable.forEach(Iterable.java:74) at com.vaadin.flow.component.internal.UIInternals.dumpPendingJavaScriptInvocations(UIInternals.java:645) at com.vaadin.flow.server.communication.UidlWriter.createUidl(UidlWriter.java:187) at com.vaadin.flow.server.communication.UidlRequestHandler.createUidl(UidlRequestHandler.java:185) at com.vaadin.flow.server.communication.UidlRequestHandler.writeUidl(UidlRequestHandler.java:174) at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:137) at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:63) at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1879) at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:398) at com.vaadin.cdi.CdiVaadinServlet.service(CdiVaadinServlet.java:66) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
Stacktrace 4:
java.util.ConcurrentModificationException: null at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:1023) at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:1046) at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1950) at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:632) at com.vaadin.flow.component.internal.UIInternals.containsPendingJavascript(UIInternals.java:721) at com.vaadin.flow.component.UI.replaceStateIfDiffersAndNoReplacePending(UI.java:1926) at com.vaadin.flow.component.UI.browserNavigate(UI.java:1907) at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:244) at com.vaadin.flow.component.ComponentEventBus.handleDomEvent(ComponentEventBus.java:501) at com.vaadin.flow.component.ComponentEventBus.lambda$addDomTrigger$dd1b7957$1(ComponentEventBus.java:303) at com.vaadin.flow.internal.nodefeature.ElementListenerMap.lambda$fireEvent$2(ElementListenerMap.java:475) at java.util.ArrayList.forEach(ArrayList.java:1596) at com.vaadin.flow.internal.nodefeature.ElementListenerMap.fireEvent(ElementListenerMap.java:475) at com.vaadin.flow.server.communication.rpc.EventRpcHandler.handleNode(EventRpcHandler.java:62) at com.vaadin.flow.server.communication.rpc.AbstractRpcInvocationHandler.handle(AbstractRpcInvocationHandler.java:79) at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocationData(ServerRpcHandler.java:568) at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$6(ServerRpcHandler.java:549) at java.util.ArrayList.forEach(ArrayList.java:1596) at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:549) at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:376) at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:136) at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:63) at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1879) at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:398) at com.vaadin.cdi.CdiVaadinServlet.service(CdiVaadinServlet.java:66) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
Expected behavior
UiInternals should never throw ConcurrentModificationException.
Minimal reproducible example
Not consistently reproducible. Seems to occur when interacting with a page while a non-ui thread calls Ui.access/accessSynchronously.
Versions
- Vaadin / Flow version: 24.9.5
- Java version: 21