From a3e8767fb18bbf8353498f45ef6ff9df9e9e39ff Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Fri, 18 Aug 2023 15:26:42 +0200 Subject: [PATCH] [Gradle] Fix classpath cache key in ClassLoadersCachingBuildService Lists have defined contracts for equals and hashCode and thus might be used as map keys for the sake of caching. Gradle's file collections do not follow those contracts, leading to cache misses and creating too many classloaders. #KT-61426 Fixed --- .../gradle/internal/ClassLoadersCachingBuildService.kt | 9 +++++---- .../BuildToolsApiClasspathEntrySnapshotTransform.kt | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ClassLoadersCachingBuildService.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ClassLoadersCachingBuildService.kt index bd817018136..b11dc33cce3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ClassLoadersCachingBuildService.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ClassLoadersCachingBuildService.kt @@ -33,13 +33,14 @@ internal abstract class ClassLoadersCachingBuildService : BuildService, + classpath: List, parentClassLoaderProvider: ParentClassLoaderProvider = DefaultParentClassLoaderProvider() - ) = - classLoaders.computeIfAbsent(ClassLoaderCacheKey(classpath, parentClassLoaderProvider)) { + ): ClassLoader { + return classLoaders.computeIfAbsent(ClassLoaderCacheKey(classpath, parentClassLoaderProvider)) { logger.debug("Creating a new classloader for classpath $classpath") URLClassLoader(classpath.map { it.toURI().toURL() }.toTypedArray(), parentClassLoaderProvider.getClassLoader()) } + } override fun close() { logger.debug("Clearing ${classLoaders.size} cached classloaders") @@ -59,7 +60,7 @@ internal abstract class ClassLoadersCachingBuildService : BuildService, + val classpath: List, val parentClassLoaderProvider: ParentClassLoaderProvider, ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/transforms/BuildToolsApiClasspathEntrySnapshotTransform.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/transforms/BuildToolsApiClasspathEntrySnapshotTransform.kt index fa1432f286f..66fa7457a1b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/transforms/BuildToolsApiClasspathEntrySnapshotTransform.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/transforms/BuildToolsApiClasspathEntrySnapshotTransform.kt @@ -50,7 +50,7 @@ abstract class BuildToolsApiClasspathEntrySnapshotTransform : TransformAction