Gradle: ConcurrentModificationException when project appears transitively

Created on 4 Apr 2019  路  1Comment  路  Source: gradle/gradle

I'm sorry this is a bit abstract as I couldn't figure out a repro yet, but I can describe what is breaking, and exactly what code path causes the exception to occur.

This is in gradle 5.2.1.

Expected Behavior

Should never get ConcurrentModificationException.

Current Behavior

Getting a ConcurrentModificationException here while resolving a configuration:

Caused by: 
java.util.ConcurrentModificationException
: 
(No message provided)
Close stacktrace
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.NodeState.removeOutgoingEdges(NodeState.java:486)
at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.NodeState.visitOutgoingDependencies(NodeState.java:230)
at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:169)
at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:131)
at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:121)
at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:171)
at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:86)
at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:73)

Upon debugging, the place where the exception is _caused_ is as shown in the stacktrace below. This line NodeState.java:564 removes an item from the NodeState's outgoingEdges list that is being iterated on in removeOutgoingEdges, and so when the for-each loop calls next() on that iterator, it gets the exception.

at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.NodeState.clearConstraintEdges(NodeState.java:564)
      at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.ModuleResolveState.decreaseHardEdgeCount(ModuleResolveState.java:367)
      at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.maybeDecreaseHardEdgeCount(EdgeState.java:286)
      at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.NodeState.removeOutgoingEdges(NodeState.java:489)
      at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.NodeState.visitOutgoingDependencies(NodeState.java:230)
      at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:169)
      at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:131)
      at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:121)
      at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:171)
      at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:86)
      at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:73)

Context


Steps to Reproduce


Your Environment



Build scan URL:

bug contributor dependency-management

Most helpful comment

I found a way to reproduce this, working on a fix.

>All comments

I found a way to reproduce this, working on a fix.

Was this page helpful?
0 / 5 - 0 ratings