https://kotlinlang.org logo
#multiplatform
Title
# multiplatform
j

jessewilson

11/16/2023, 6:37 AM
I’ve seen this crash when using Gradle’s build cache in a Kotlin/Multiplatform project:
Copy code
java.lang.IllegalStateException: Already completed with Success(com.example.mymodule)
	at org.jetbrains.kotlin.gradle.utils.Completable.completeWith(Future.kt:240)
	at org.jetbrains.kotlin.gradle.utils.Completable.complete(Future.kt:263)
	at org.jetbrains.kotlin.gradle.utils.MappedFutureImpl.getOrThrow(Future.kt:161)
	at org.jetbrains.kotlin.gradle.utils.LenientFutureImpl.getOrThrow(Future.kt:185)
	at org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation.toModuleDependencyIdentifier(GranularMetadataTransformation.kt:305)
	at org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation.processDependency(GranularMetadataTransformation.kt:262)
	at org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation.doTransform(GranularMetadataTransformation.kt:159)
	at org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation.access$doTransform(GranularMetadataTransformation.kt:90)
	at org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation$metadataDependencyResolutions$2.invoke(GranularMetadataTransformation.kt:124)
	at org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation$metadataDependencyResolutions$2.invoke(GranularMetadataTransformation.kt:124)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at org.jetbrains.kotlin.gradle.plugin.mpp.GranularMetadataTransformation.getMetadataDependencyResolutions(GranularMetadataTransformation.kt:124)
	at org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyTransformationTask.transformMetadata(MetadataDependencyTransformationTask.kt:135)
    ...
My best guess is that
MappedFutureImpl.getOrThrow()
is making racy calls to
value.complete()
. My build also uses
--parallel
!
a

a-dd

11/16/2023, 7:40 AM
cc @Anton Lakotka [JB]
thank you color 1
a

Anton Lakotka [JB]

11/16/2023, 10:20 AM
Did it happen during build or IDE import?
j

jessewilson

11/16/2023, 3:27 PM
This occurred on a CI build that uses
--parallel
plus Gradle’s build cache.
a

Anton Lakotka [JB]

11/16/2023, 4:22 PM
Yes, I investigated this issue. Here the YouTrack (KT-63536) issue you can track it. For now, you can workaround it by declaring some fake output directory to all metadata transformation tasks. This will make Gradle run these tasks in a sequential order. These tasks are fast, so you shouldn't have any significant performance degradation.
Copy code
tasks.withType<MetadataDependencyTransformationTask>().configureEach {
    // share some fake directory as an output
    // this will make Gradle to run MetadataDependencyTransformationTask tasks in sequential order
    outputs.dir(layout.buildDirectory.file("tmp"))
}
Thank you very much for reporting it!
j

jessewilson

11/16/2023, 6:14 PM
OH SWEET, I can do that