Skip to content

ConcurrentModificationExceptions from UiInternals #22742

@MSCCSS

Description

@MSCCSS

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions