Skip to content

Conversation

@vmishenev
Copy link
Contributor

@vmishenev vmishenev commented Jul 30, 2025

Here, kotlin-analysis-symbols is built with the latest compiler version (#4178), and Dokka uses the shadowed stdlib from kotlin-analysis-symbols or kotlin-analysis-descriptors.

@vmishenev vmishenev force-pushed the vmishenev/update-aa-to-2.3.0-dev-1719 branch from e41e3b7 to d790338 Compare July 30, 2025 23:19
@vmishenev
Copy link
Contributor Author

vmishenev commented Jul 31, 2025

In DGPv2, a shadowed stdlib (in this case v2.2.0) from kotlin-analysis-symbol should be used, but I encountered gradle/gradle#34442

cc @adam-enko @whyoleg

@vmishenev vmishenev force-pushed the vmishenev/update-aa-to-2.3.0-dev-1719 branch from 64b693b to 9d240c7 Compare August 7, 2025 23:06
@vmishenev vmishenev force-pushed the vmishenev/update-aa-to-2.3.0-dev-1719 branch from 9d240c7 to a8f07e6 Compare August 7, 2025 23:13
@vmishenev vmishenev force-pushed the vmishenev/update-aa-to-2.3.0-dev-1719 branch from 7f5a163 to 773365a Compare August 8, 2025 00:36
@vmishenev vmishenev marked this pull request as ready for review August 8, 2025 09:20
@vmishenev vmishenev force-pushed the vmishenev/update-aa-to-2.3.0-dev-1719 branch from 42b24ac to 7bb7898 Compare August 8, 2025 09:23
@vmishenev vmishenev requested review from adam-enko and whyoleg August 8, 2025 09:35
Copy link
Collaborator

@whyoleg whyoleg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great job!!
I do have some comments, which might (or might not) could simplify the things a bit. I would also like to wait for @adam-enko review before merging it

@whyoleg
Copy link
Collaborator

whyoleg commented Aug 11, 2025

Please check CI :)

@vmishenev vmishenev force-pushed the vmishenev/update-aa-to-2.3.0-dev-1719 branch from 7deeb3c to eebbb41 Compare August 11, 2025 21:05
* To be compatible with the AA, Dokka analysis should be compiled with approximately the same version
* See https://kotlinlang.org/docs/kotlin-evolution-principles.html#evolving-the-binary-format
*/
val analysisK2Projects = listOf("analysis-kotlin-symbols")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd really rather avoid referring to subprojects by name in convention plugins. It makes the conventions more fragile, and it's harder to reason about.

Instead, I'd suggest updating DokkaBuildProperties to either add btaCompilerVersion and btaLanguageVersion, or a a single boolean on/off flag and zip it with the properties. Then the behaviour can be controlled per subproject more idiomatically.

Copy link
Contributor Author

@vmishenev vmishenev Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, I'd suggest updating DokkaBuildProperties to either add btaCompilerVersion and btaLanguageVersion, or a a single boolean on/off flag and zip it with the properties.

This is enforceGradleKotlinCompatibility, not an extra flag, but I cannot set it per project due to gradle/gradle#23572. (see the discussion above)
Although, I could use a workaround from there. WDYT?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both workaround and explicit project specification here are fine for me, as in reality, we don't need a general solution here, but only for this specific module, because of a specific issue

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's leave it as is. If I have time I'll come back and tinker with it later.

@vmishenev vmishenev requested a review from adam-enko August 13, 2025 21:40
@adam-enko
Copy link
Member

CI OOMs during DGPv1, Jekyll, and Jackson?


00:03:38       * Exception is:
00:03:38       org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':moduleA:dokkaJekyllCollector'.
00:03:38         at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:142)
00:03:38         at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
00:03:38         at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:140)
00:03:38         at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:128)
00:03:38         at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
00:03:38         at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
00:03:38         at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
00:03:38         at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
00:03:38         at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:57)
00:03:38         at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
00:03:38         at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:69)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:322)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:309)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:302)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:288)
00:03:38         at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:462)
00:03:38         at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:379)
00:03:38         at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
00:03:38         at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
00:03:38       Caused by: org.gradle.internal.UncheckedException: java.lang.reflect.InvocationTargetException
00:03:38         at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:68)
00:03:38         at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:41)
00:03:38         at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:128)
00:03:38         at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
00:03:38         at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
00:03:38         at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
00:03:38         at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:236)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
00:03:38         at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:221)
00:03:38         at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:204)
00:03:38         at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:187)
00:03:38         at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:165)
00:03:38         at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
00:03:38         at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
00:03:38         at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
00:03:38         at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
00:03:38         at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
00:03:38         at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
00:03:38         at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
00:03:38         at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
00:03:38         at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
00:03:38         at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
00:03:38         at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
00:03:38         at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
00:03:38         at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
00:03:38         at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:124)
00:03:38         at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:80)
00:03:38         at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:58)
00:03:38         at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
00:03:38         at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:181)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.executeAndStoreInCache(BuildCacheStep.java:154)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$4(BuildCacheStep.java:121)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$5(BuildCacheStep.java:121)
00:03:38         at org.gradle.internal.Try$Success.map(Try.java:164)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.executeWithCache(BuildCacheStep.java:81)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$0(BuildCacheStep.java:70)
00:03:38         at org.gradle.internal.Either$Left.fold(Either.java:115)
00:03:38         at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:69)
00:03:38         at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:47)
00:03:38         at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
00:03:38         at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
00:03:38         at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
00:03:38         at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
00:03:38         at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:110)
00:03:38         at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
00:03:38         at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
00:03:38         at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
00:03:38         at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
00:03:38         at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
00:03:38         at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
00:03:38         at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
00:03:38         at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
00:03:38         at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
00:03:38         at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:102)
00:03:38         at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
00:03:38         at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
00:03:38         at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
00:03:38         at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:254)
00:03:38         at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:91)
00:03:38         at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:56)
00:03:38         at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
00:03:38         at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
00:03:38         at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
00:03:38         at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
00:03:38         at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
00:03:38         at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
00:03:38         at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:281)
00:03:38         at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
00:03:38         at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
00:03:38         at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
00:03:38         at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
00:03:38         at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
00:03:38         at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
00:03:38         at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
00:03:38         at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:139)
00:03:38         at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:128)
00:03:38         at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
00:03:38         at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
00:03:38         at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
00:03:38         at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
00:03:38         at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:57)
00:03:38         at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
00:03:38         at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
00:03:38         at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
00:03:38         at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:69)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:322)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:309)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:302)
00:03:38         at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:288)
00:03:38         at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:462)
00:03:38         at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:379)
00:03:38         at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
00:03:38         at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
00:03:38       Caused by: java.lang.reflect.InvocationTargetException
00:03:38         at org.jetbrains.dokka.gradle.internal.DokkaBootstrapFactoryKt$DokkaBootstrap$1.configure(dokkaBootstrapFactory.kt:36)
00:03:38         at org.jetbrains.dokka.gradle.internal.DokkaBootstrapFactoryKt.generateDocumentationViaDokkaBootstrap(dokkaBootstrapFactory.kt:60)
00:03:38         at org.jetbrains.dokka.gradle.AbstractDokkaTask.generateDocumentation$dokka_gradle_plugin(AbstractDokkaTask.kt:238)
00:03:38         at org.jetbrains.dokka.gradle.DokkaCollectorTask.generateDocumentation$dokka_gradle_plugin(DokkaCollectorTask.kt:18)
00:03:38         at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
00:03:38         ... 117 more
00:03:38       Caused by: java.lang.OutOfMemoryError: Metaspace
00:03:38         at com.fasterxml.jackson.core.util.DefaultPrettyPrinter.<init>(DefaultPrettyPrinter.java:52)
00:03:38         at com.fasterxml.jackson.core.util.DefaultPrettyPrinter.<init>(DefaultPrettyPrinter.java:101)
00:03:38         at com.fasterxml.jackson.databind.SerializationConfig.<clinit>(SerializationConfig.java:38)
00:03:38         at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:642)
00:03:38         at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:567)
00:03:38         at com.fasterxml.jackson.databind.json.JsonMapper.<init>(JsonMapper.java:93)
00:03:38         at com.fasterxml.jackson.databind.json.JsonMapper.<init>(JsonMapper.java:89)
00:03:38         at com.fasterxml.jackson.databind.json.JsonMapper.builder(JsonMapper.java:114)
00:03:38         at com.fasterxml.jackson.module.kotlin.ExtensionsKt.jsonMapper(Extensions.kt:27)
00:03:38         at com.fasterxml.jackson.module.kotlin.ExtensionsKt.jacksonObjectMapper(Extensions.kt:32)

":moduleA:dokkaHtmlMultiModule",
":moduleA:dokkaGfmMultiModule",
":moduleA:dokkaJekyllMultiModule",
jvmArgs = listOf("-Xmx2G", "-XX:MaxMetaspaceSize=1600m")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TBH, I don't really like that we increased this value from -XX:MaxMetaspaceSize=1G to 1.6 GB already.

WDYT about splitting the PR into two parts:

  • re-setup analysis modules, building, and Dokka running
  • updating the version of AA

So far, it's not clear what causes this 50% spike in metaspace memory usage. We should probably not just ignore it by increasing the memory used.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the idea of splitting it up. We could also split the custom classloader into a separate PR (it'd help me be able to review only the parts that are related to DGP)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems we have the same problem we encountered during the stress tests on JVM 8#3802.
The change in the order of dependencies (and the stdlib version) in the classpath somehow affects GC that leads to flaky integration tests.
Nevertheless, there is no memory leak.

I also noticed one misuse in Dokka runtime classpath.
Actually it has two different versions of stdlib: a shadowed version in kotlin-analysis-* and one from other dependencies.
For example, it has 2 different versions: 2.2 (inkotlin-analysis-* ) and 2.0.21
Version aligning does not work for the shadowed stdlib.
image
I think it causes the classloader/GC to perform additional work.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JIC aligning the stdlib version with 2.2.0 does NOT help to avoid increasing (aggressive GC) metaspace in the tests.
I used this hack for an experiment - b7fb1d2
(the same works for the base-plugin). Notice: at compile time the old stdlib is used.
The build scan

An alternative solution is to build base-plugin with Kotlin 2.2.0 so it will have stdlib 2.2.0. In this case, we don't need to change the DGPv1. Also, we can consider to exclude the shadowed stdlib from kotlin-analysis-*

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also noticed one misuse in Dokka runtime classpath.
Actually it has two different versions of stdlib: a shadowed version in kotlin-analysis-* and one from other dependencies.

But I believe that it should not cause any issues, as we load stdlib classes from kotlin-analysis-* artefacts first?
I mean, we had the same situation previously, as shadowed kotlin-analysis-* always contains kotlin-stdlib coming from kotlin-compiler
Or am I missing something?

An alternative solution is to build base-plugin with Kotlin 2.2.0 so it will have stdlib 2.2.0.

I'm not sure I understand how this will help, as we will still have multiple stdlib versions (one from kotlin-compiler-k2 and one from base), though they will be closer to each other (2.2.0-dev/2.3.0-dev and 2.2.0).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean, we had the same situation previously, as shadowed kotlin-analysis-* always contains kotlin-stdlib coming from kotlin-compiler

Sorry, I forgot that kotlin-compiler already includes a shadowed stdlib, although kotlin-compiler-for-ide does not have.
So, for now, there is nothing we can do about it.

But I believe that it should not cause any issues, as we load stdlib classes from kotlin-analysis-* artefacts first?

Yes, in theory, it could only lead to performance issues, but I’m not sure.

":moduleA:dokkaJekyllMultiModule",
jvmArgs = listOf(
"-Xmx1G", "-XX:MaxMetaspaceSize=600m",
"-XX:SoftRefLRUPolicyMSPerMB=10" // to free up the metaspace on JVM 8, see https://youtrack.jetbrains.com/issue/KT-55831/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting!

Do you think we should consider adding this arg to the process-isolated workers in DGPv2?

Also, perhaps -XX:+AlwaysPreTouch would help here too? (I'm not very confident it helps with DGPv2, but it doesn't seem to hurt.)

jvmArgs.convention(
listOf(
//"-XX:MaxMetaspaceSize=512m",
"-XX:+HeapDumpOnOutOfMemoryError",
"-XX:+AlwaysPreTouch", // https://github.com/gradle/gradle/issues/3093#issuecomment-387259298
//"-XX:StartFlightRecording=disk=true,name={path.drop(1).map { if (it.isLetterOrDigit()) it else '-' }.joinToString("")},dumponexit=true,duration=30s",
//"-XX:FlightRecorderOptions=repository=$baseDir/jfr,stackdepth=512",
)
)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think we should consider adding this arg to the process-isolated workers in DGPv2?

I prefer using a cached classloader if it is possible with Shared Build Services.
We can temporarily use this flag in DGPv2 until a cached classloader is implemented.
If it’s really needed, let’s do it in another PR.

Also, perhaps -XX:+AlwaysPreTouch would help here too?

Here "-XX:SoftRefLRUPolicyMSPerMB=10" help us very well. I’d like to minimize the use of "magical" JVM flags.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think we should consider adding this arg to the process-isolated workers in DGPv2?

I think we previously decided that it's fine to use this option in tests only in #3802, so I suggest sticking with it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We discussed briefly in KBT and we think it could be helpful, but it's a sensitive flag so let's leave it for now.

@vmishenev vmishenev force-pushed the vmishenev/update-aa-to-2.3.0-dev-1719 branch from 892e4df to 3b3ddbe Compare August 14, 2025 21:26
@vmishenev vmishenev changed the title Update Analysis API to 2.3.0-dev-1719 Build kotlin-analysis-symbols module with the latest compiler version Aug 15, 2025
@vmishenev vmishenev changed the title Build kotlin-analysis-symbols module with the latest compiler version Build kotlin-analysis-symbols module with the latest compiler version Aug 15, 2025
* To be compatible with the AA, Dokka analysis should be compiled with approximately the same version
* See https://kotlinlang.org/docs/kotlin-evolution-principles.html#evolving-the-binary-format
*/
val analysisK2Projects = listOf("analysis-kotlin-symbols")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's leave it as is. If I have time I'll come back and tinker with it later.

":moduleA:dokkaJekyllMultiModule",
jvmArgs = listOf(
"-Xmx1G", "-XX:MaxMetaspaceSize=600m",
"-XX:SoftRefLRUPolicyMSPerMB=10" // to free up the metaspace on JVM 8, see https://youtrack.jetbrains.com/issue/KT-55831/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We discussed briefly in KBT and we think it could be helpful, but it's a sensitive flag so let's leave it for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Build kotlin-analysis-symbols module with the latest compiler version

4 participants