Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regression in 8.2: StackOverflowError w/ Gradle 8.2 + Quarkus 2.16.7 (latest) #25579

Closed
snazy opened this issue Jun 30, 2023 · 6 comments
Closed
Assignees
Labels
a:bug has:reproducer Indicates the issue has a confirmed reproducer in:dependency-resolution engine metadata
Milestone

Comments

@snazy
Copy link
Contributor

snazy commented Jun 30, 2023

Expected Behavior

No StackOverflowError

Current Behavior

java.lang.StackOverflowError w/ repeated stack frames:

        at io.quarkus.gradle.dependency.ConditionalDependenciesEnabler.<init>(ConditionalDependenciesEnabler.java:51)
        at io.quarkus.gradle.dependency.ApplicationDeploymentClasspathBuilder.lambda$setUpDeploymentConfiguration$7(ApplicationDeploymentClasspathBuilder.java:201)
        at org.gradle.api.internal.provider.DefaultProvider.calculateOwnValue(DefaultProvider.java:72)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)
        at org.gradle.api.internal.provider.Collectors$ElementsFromCollectionProvider.collectEntries(Collectors.java:220)
        at org.gradle.api.internal.provider.AbstractCollectionProperty$CollectingSupplier.calculateValue(AbstractCollectionProperty.java:344)
        at org.gradle.api.internal.provider.AbstractCollectionProperty.calculateValueFrom(AbstractCollectionProperty.java:189)
        at org.gradle.api.internal.provider.AbstractCollectionProperty.calculateValueFrom(AbstractCollectionProperty.java:37)
        at org.gradle.api.internal.provider.AbstractProperty.doCalculateValue(AbstractProperty.java:142)
        at org.gradle.api.internal.provider.AbstractProperty.calculateOwnValue(AbstractProperty.java:136)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateOwnPresentValue(AbstractMinimalProvider.java:73)
        at org.gradle.api.internal.provider.AbstractCollectionProperty.size(AbstractCollectionProperty.java:97)
        at org.gradle.api.internal.provider.Collectors$ElementsFromCollectionProvider.size(Collectors.java:264)
        at org.gradle.api.internal.collections.AbstractIterationOrderRetainingElementSource$Element.realize(AbstractIterationOrderRetainingElementSource.java:315)
        at org.gradle.api.internal.collections.AbstractIterationOrderRetainingElementSource.realizePending(AbstractIterationOrderRetainingElementSource.java:131)
        at org.gradle.api.internal.collections.IterationOrderRetainingSetElementSource.iterator(IterationOrderRetainingSetElementSource.java:45)
        at org.gradle.api.internal.DefaultDomainObjectCollection.iterator(DefaultDomainObjectCollection.java:128)
        at org.gradle.api.internal.DelegatingDomainObjectSet.iterator(DelegatingDomainObjectSet.java:144)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.doGetDefinedState(DefaultLocalConfigurationMetadataBuilder.java:216)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.LocalConfigurationMetadataBuilder$DependencyCache.computeIfAbsent(LocalConfigurationMetadataBuilder.java:70)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.getDefinedState(DefaultLocalConfigurationMetadataBuilder.java:193)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.getState(DefaultLocalConfigurationMetadataBuilder.java:179)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.create(DefaultLocalConfigurationMetadataBuilder.java:115)
        at org.gradle.internal.component.local.model.DefaultLocalComponentMetadata$ConfigurationsProviderMetadataFactory.getConfiguration(DefaultLocalComponentMetadata.java:337)
        at org.gradle.internal.component.local.model.DefaultLocalComponentMetadata.getConfiguration(DefaultLocalComponentMetadata.java:181)
        at org.gradle.internal.component.local.model.DefaultLocalComponentMetadata.getVariantsForGraphTraversal(DefaultLocalComponentMetadata.java:164)
        at org.gradle.internal.component.model.LocalComponentDependencyMetadata.selectVariants(LocalComponentDependencyMetadata.java:146)
        at org.gradle.internal.component.model.DelegatingDependencyMetadata.selectVariants(DelegatingDependencyMetadata.java:46)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.calculateTargetConfigurations(EdgeState.java:267)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.attachToTargetConfigurations(EdgeState.java:152)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.attachToTargetRevisionsSerially(DependencyGraphBuilder.java:352)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolveEdges(DependencyGraphBuilder.java:235)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:172)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:145)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:142)
        at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:192)
        at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:85)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:76)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:728)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:719)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:719)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.lambda$resolveExclusively$4(DefaultConfiguration.java:699)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$CalculatedModelValueImpl.update(DefaultProjectStateRegistry.java:493)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveExclusively(DefaultConfiguration.java:696)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:692)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:667)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
        at io.quarkus.gradle.dependency.ConditionalDependenciesEnabler.<init>(ConditionalDependenciesEnabler.java:51)
        at io.quarkus.gradle.dependency.ApplicationDeploymentClasspathBuilder.lambda$setUpDeploymentConfiguration$7(ApplicationDeploymentClasspathBuilder.java:201)
        at org.gradle.api.internal.provider.DefaultProvider.calculateOwnValue(DefaultProvider.java:72)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)
        at org.gradle.api.internal.provider.Collectors$ElementsFromCollectionProvider.collectEntries(Collectors.java:220)
        at org.gradle.api.internal.provider.AbstractCollectionProperty$CollectingSupplier.calculateValue(AbstractCollectionProperty.java:344)
        at org.gradle.api.internal.provider.AbstractCollectionProperty.calculateValueFrom(AbstractCollectionProperty.java:189)
        at org.gradle.api.internal.provider.AbstractCollectionProperty.calculateValueFrom(AbstractCollectionProperty.java:37)
        at org.gradle.api.internal.provider.AbstractProperty.doCalculateValue(AbstractProperty.java:142)
        at org.gradle.api.internal.provider.AbstractProperty.calculateOwnValue(AbstractProperty.java:136)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateOwnPresentValue(AbstractMinimalProvider.java:73)
        at org.gradle.api.internal.provider.AbstractCollectionProperty.size(AbstractCollectionProperty.java:97)
        at org.gradle.api.internal.provider.Collectors$ElementsFromCollectionProvider.size(Collectors.java:264)
        at org.gradle.api.internal.collections.AbstractIterationOrderRetainingElementSource$Element.realize(AbstractIterationOrderRetainingElementSource.java:315)
        at org.gradle.api.internal.collections.AbstractIterationOrderRetainingElementSource.realizePending(AbstractIterationOrderRetainingElementSource.java:131)
        at org.gradle.api.internal.collections.IterationOrderRetainingSetElementSource.iterator(IterationOrderRetainingSetElementSource.java:45)
        at org.gradle.api.internal.DefaultDomainObjectCollection.iterator(DefaultDomainObjectCollection.java:128)
        at org.gradle.api.internal.DelegatingDomainObjectSet.iterator(DelegatingDomainObjectSet.java:144)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.doGetDefinedState(DefaultLocalConfigurationMetadataBuilder.java:216)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.LocalConfigurationMetadataBuilder$DependencyCache.computeIfAbsent(LocalConfigurationMetadataBuilder.java:70)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.getDefinedState(DefaultLocalConfigurationMetadataBuilder.java:193)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.getState(DefaultLocalConfigurationMetadataBuilder.java:179)
        at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.dependencies.DefaultLocalConfigurationMetadataBuilder.create(DefaultLocalConfigurationMetadataBuilder.java:115)
        at org.gradle.internal.component.local.model.DefaultLocalComponentMetadata$ConfigurationsProviderMetadataFactory.getConfiguration(DefaultLocalComponentMetadata.java:337)
        at org.gradle.internal.component.local.model.DefaultLocalComponentMetadata.getConfiguration(DefaultLocalComponentMetadata.java:181)
        at org.gradle.internal.component.local.model.DefaultLocalComponentMetadata.getVariantsForGraphTraversal(DefaultLocalComponentMetadata.java:164)
        at org.gradle.internal.component.model.LocalComponentDependencyMetadata.selectVariants(LocalComponentDependencyMetadata.java:146)
        at org.gradle.internal.component.model.DelegatingDependencyMetadata.selectVariants(DelegatingDependencyMetadata.java:46)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.calculateTargetConfigurations(EdgeState.java:267)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.attachToTargetConfigurations(EdgeState.java:152)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.attachToTargetRevisionsSerially(DependencyGraphBuilder.java:352)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolveEdges(DependencyGraphBuilder.java:235)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:172)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:145)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:142)
        at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:192)
        at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:85)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:76)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:728)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:719)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:719)

Context (optional)

This failure happens since Gradle 8.2. Gradle 8.1.1 works fine (regression with Gradle 8.2).
This happens with Quarkus 2.16.7.Final (Quarkus Gradle plugin version).

The failure seems not to happen with Quarkus 3.1.3.Final (the Quarkus Gradle plugin has been heavily changed in Quarkus 3). Haven't sorted out the task-dependency issues yet, so haven't seen the build passing w/ Quarkus 3 + Gradle 8.2 yet.

Tried with Java 20.0.1 + 17.0.7.

Steps to Reproduce

  1. git clone https://github.com/projectnessie/nessie.git
  2. cd nessie
  3. ./gradlew compileJava

Gradle version

8.2

Build scan URL (optional)

CI w/ Quarkus leads to build scan
CI w/o Quarkus leads to build scan

Your Environment (optional)

Linux 6.4.0
No additional/changed Gradle settings than in the source repo's gradle.properties

@ov7a
Copy link
Member

ov7a commented Jul 3, 2023

Thank you for providing a valid reproducer.

The issue is in the backlog of the relevant team, but this area of Gradle is currently not a focus one, so it might take a while before a fix is made.

@ov7a ov7a added the has:reproducer Indicates the issue has a confirmed reproducer label Jul 3, 2023
@snazy
Copy link
Contributor Author

snazy commented Jul 3, 2023

Update: Gradle 8.2 works with the Quarkus 3 Gradle plugin, but not w/ the Quarkus 2 Gradle plugin.

@ov7a ov7a added the to-triage label Jul 3, 2023
@jbartok jbartok closed this as not planned Won't fix, can't repro, duplicate, stale Jul 5, 2023
@jbartok jbartok added the closed:not-fixed Indicates the issue was not fixed and is not planned to be label Jul 5, 2023
@github-actions github-actions bot removed the to-triage label Jul 5, 2023
@jbartok jbartok reopened this Jul 5, 2023
@jbartok
Copy link
Member

jbartok commented Jul 5, 2023

Thank you for your interest in Gradle!

This issue needs a decision from the team responsible for that area. They have been informed. Response time may vary.

@jbartok jbartok added 👋 team-triage Issues that need to be triaged by a specific team and removed closed:not-fixed Indicates the issue was not fixed and is not planned to be labels Jul 5, 2023
@jvandort
Copy link
Member

jvandort commented Jul 5, 2023

This will be fixed in 8.2.1 by #25626

bot-gradle added a commit that referenced this issue Jul 6, 2023
…solve current project

Prior to 8.2, addAllLater hooks on a configuration could resolve other configurations in the same project in order to determine the dependencies to add. 8.2 added a change which eager calculated confguration metadata dependenices for all consumable variants in the same project, causing a stackoverflow. This once again makes configuration dependency calculation lazy, avoiding a stackoverflow. Note, a stackoverflow will likely still happen if the configuration with the lazy dependencies selects itself. But, this makes no sense conceptually.

Fixes: #25579

Co-authored-by: Justin Van Dort <jvandort@gradle.com>
@jvandort jvandort self-assigned this Jul 6, 2023
@jvandort jvandort closed this as completed Jul 6, 2023
@jvandort jvandort added this to the 8.2.1 milestone Jul 6, 2023
@ljacomet ljacomet removed to-triage 👋 team-triage Issues that need to be triaged by a specific team labels Jul 6, 2023
@ljacomet
Copy link
Member

ljacomet commented Jul 7, 2023

Hey @snazy,

Could you confirm that the 8.2.1 nightly fixes this reported issue?
Version: 8.2.1-20230707035526+0000

@snazy
Copy link
Contributor Author

snazy commented Jul 7, 2023

Looks good!
Our CI's happy with that nightly: https://github.com/projectnessie/nessie/actions/runs/5483869717

snazy added a commit to snazy/nessie that referenced this issue Jul 14, 2023
Gradle 8.2.0+8.2.1 have serious bugs in combination with Quarkus, causing builds to fail with either a [`StackOverflowException`](gradle/gradle#25579)) or [`ConcurrentModificationException`](gradle/gradle#25751).

This change reverts Gradle back to 8.1.1 and also cleans up the failed, nowhere (yet) published Nessie releases 0.65.0+0.65.1.
snazy added a commit to snazy/nessie that referenced this issue Jul 14, 2023
Gradle 8.2.0+8.2.1 have serious bugs in combination with Quarkus, causing builds to fail with either a [`StackOverflowException`](gradle/gradle#25579)) or [`ConcurrentModificationException`](gradle/gradle#25751).

This change reverts Gradle back to 8.1.1 and also cleans up the failed, nowhere (yet) published Nessie releases 0.65.0+0.65.1.
snazy added a commit to projectnessie/nessie that referenced this issue Jul 14, 2023
Gradle 8.2.0+8.2.1 have serious bugs in combination with Quarkus, causing builds to fail with either a [`StackOverflowException`](gradle/gradle#25579)) or [`ConcurrentModificationException`](gradle/gradle#25751).

This change reverts Gradle back to 8.1.1 and also cleans up the failed, nowhere (yet) published Nessie releases 0.65.0+0.65.1.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
a:bug has:reproducer Indicates the issue has a confirmed reproducer in:dependency-resolution engine metadata
Projects
None yet
Development

No branches or pull requests

5 participants