From cc69df0de695c20aa1bba1f8f8a28188d53a8058 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 9 Nov 2023 11:53:41 +0200 Subject: [PATCH] [K/N] Optimized libraries hash computation #KT-63081 Fixed --- .../kotlin/backend/konan/CacheBuilder.kt | 4 ++- .../kotlin/backend/konan/CachedLibraries.kt | 25 ++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt index f7bfdccb681..301d0bdb4fa 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CacheBuilder.kt @@ -50,6 +50,7 @@ class CacheBuilder( private val allLibraries by lazy { konanConfig.resolvedLibraries.getFullList(TopologicalLibraryOrder) } private val uniqueNameToLibrary by lazy { allLibraries.associateBy { it.uniqueName } } + private val uniqueNameToHash = mutableMapOf() private val caches = mutableMapOf() private val cacheRootDirectories = mutableMapOf() @@ -237,7 +238,8 @@ class CacheBuilder( val libraryCacheDirectory = when { library.isDefault -> konanConfig.systemCacheDirectory - isExternal -> CachedLibraries.computeVersionedCacheDirectory(konanConfig.autoCacheDirectory, library, uniqueNameToLibrary) + isExternal -> CachedLibraries.computeVersionedCacheDirectory( + konanConfig.autoCacheDirectory, library, uniqueNameToLibrary, uniqueNameToHash) else -> konanConfig.incrementalCacheDirectory!! } val libraryCache = libraryCacheDirectory.child( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt index 906eaa0b8b7..9ca067603b5 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CachedLibraries.kt @@ -171,6 +171,7 @@ class CachedLibraries( } private val uniqueNameToLibrary = allLibraries.associateBy { it.uniqueName } + private val uniqueNameToHash = mutableMapOf() private val allCaches: Map = allLibraries.mapNotNull { library -> val explicitPath = explicitCaches[library] @@ -186,7 +187,7 @@ class CachedLibraries( } ?: autoCacheDirectory.takeIf { autoCacheableFrom.any { libraryPath.startsWith(it.absolutePath) } } ?.let { - val dir = computeVersionedCacheDirectory(it, library, uniqueNameToLibrary) + val dir = computeVersionedCacheDirectory(it, library, uniqueNameToLibrary, uniqueNameToHash) selectCache(library, dir.child(getPerFileCachedLibraryName(library))) ?: selectCache(library, dir.child(getCachedLibraryName(library))) } @@ -220,12 +221,28 @@ class CachedLibraries( fun getCachedLibraryName(library: KotlinLibrary): String = getCachedLibraryName(library.uniqueName) fun getCachedLibraryName(libraryName: String): String = "$libraryName-cache" - fun computeVersionedCacheDirectory(baseCacheDirectory: File, library: KotlinLibrary, allLibraries: Map): File { + private fun computeLibraryHash( + library: KotlinLibrary, + librariesHashes: MutableMap, + ): ByteArray = librariesHashes.getOrPut(library.uniqueName) { + val messageDigest = MessageDigest.getInstance("SHA-256") + messageDigest.digestLibrary(library) + messageDigest.digest() + } + + fun computeVersionedCacheDirectory( + baseCacheDirectory: File, + library: KotlinLibrary, + allLibraries: Map, + librariesHashes: MutableMap, + ): File { val dependencies = library.getAllTransitiveDependencies(allLibraries) val messageDigest = MessageDigest.getInstance("SHA-256") messageDigest.update(compilerMarker) - messageDigest.digestLibrary(library) - dependencies.sortedBy { it.uniqueName }.forEach { messageDigest.digestLibrary(it) } + messageDigest.update(computeLibraryHash(library, librariesHashes)) + dependencies.sortedBy { it.uniqueName }.forEach { + messageDigest.update(computeLibraryHash(it, librariesHashes)) + } val version = library.versions.libraryVersion ?: "unspecified" val hashString = messageDigest.digest()