ari-ban / issue-test

0 stars 0 forks source link

ConcurrentModificationException in Http2Session.pruneStreams #1995

Closed arinban closed 6 years ago

arinban commented 6 years ago

Hi Team I observe multiple ConcurrentModificationExceptions thrown from https://github.com/javaee/grizzly/blob/4537e092c3a60557013014f279564fa4877cad29/modules/http2/src/main/java/org/glassfish/grizzly/http2/Http2Session.java#L699-L714

GRIZZLY0013: Exception during FilterChain execution
java.util.ConcurrentModificationException
    at java.util.TreeMap$NavigableSubMap$SubMapIterator.nextEntry(TreeMap.java:1703)
    at java.util.TreeMap$NavigableSubMap$SubMapEntryIterator.next(TreeMap.java:1751)
    at java.util.TreeMap$NavigableSubMap$SubMapEntryIterator.next(TreeMap.java:1745)
    at java.util.AbstractMap$2$1.next(AbstractMap.java:418)
    at org.glassfish.grizzly.http2.Http2Session.pruneStreams(Http2Session.java:709)
    at org.glassfish.grizzly.http2.Http2Session.setGoAwayLocally(Http2Session.java:682)
    at org.glassfish.grizzly.http2.Http2Session.terminate(Http2Session.java:625)
    at org.glassfish.grizzly.http2.Http2BaseFilter.processFrames(Http2BaseFilter.java:212)
    at org.glassfish.grizzly.http2.Http2ServerFilter.handleRead(Http2ServerFilter.java:563)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:748)

by Faces application.

S/W Versions

arinban commented 6 years ago
arinban commented 6 years ago

@pzygielo Commented I prepared UT (pzygielo/grizzly@02fbb93eae0def0edca27f790610c4141a6202c0) to expose this behaviour. Seems that in favourable conditions (e.g. some streams already closed), streamIds.remove() is indeed executed, and it breaks iteration over invalidStreams.values().