[JS IR IC] Drop incremental cache after updating a klib set
Enabled Partial Linkage may replace entire IR expressions with a stub during klib linking and loading. This may break the incremental cache dependency graph. Dropping incremental cache files after updating klibs (e.g. update klib version) covers almost all cases which could not be tracked due to a broken dependency graph. This patch could be reverted after fixing KT-57347
This commit is contained in:
committed by
Space Team
parent
c9badd14a7
commit
980d83eccd
@@ -118,12 +118,28 @@ class CacheUpdater(
|
||||
libs.filter { it.libraryFile.canonicalPath in friendPaths }
|
||||
}
|
||||
|
||||
private val incrementalCaches = libraryDependencies.keys.associate { lib ->
|
||||
private val klibCacheDirs = libraryDependencies.keys.map { lib ->
|
||||
val libFile = KotlinLibraryFile(lib)
|
||||
val file = File(libFile.path)
|
||||
val pathHash = file.absolutePath.cityHash64().toULong().toString(Character.MAX_RADIX)
|
||||
val libraryCacheDir = File(cacheRootDir, "${file.name}.$pathHash")
|
||||
libFile to IncrementalCache(KotlinLoadedLibraryHeader(lib), libraryCacheDir)
|
||||
File(cacheRootDir, "${file.name}.$pathHash")
|
||||
}
|
||||
|
||||
init {
|
||||
// Enabled Partial Linkage may replace entire IR expressions with a stub during klib linking and loading.
|
||||
// This may break the incremental cache dependency graph.
|
||||
// Dropping incremental cache files after updating klibs (e.g. update klib version)
|
||||
// covers almost all cases which could not be tracked due to a broken dependency graph.
|
||||
// TODO: This code could be removed after fixing KT-57347
|
||||
val oldKlibCaches = cacheRootDir.listFiles { file: File -> file.isDirectory }?.mapTo(hashSetOf()) { it.name } ?: emptySet()
|
||||
val newKlibCaches = klibCacheDirs.mapTo(hashSetOf()) { it.name }
|
||||
if (oldKlibCaches != newKlibCaches) {
|
||||
cacheRootDir.deleteRecursively()
|
||||
}
|
||||
}
|
||||
|
||||
private val incrementalCaches = libraryDependencies.keys.zip(klibCacheDirs).associate { (lib, libraryCacheDir) ->
|
||||
KotlinLibraryFile(lib) to IncrementalCache(KotlinLoadedLibraryHeader(lib), libraryCacheDir)
|
||||
}
|
||||
|
||||
private val removedIncrementalCaches = buildList {
|
||||
|
||||
@@ -161,15 +161,8 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
|
||||
val moduleSourceDir = File(sourceDir, module)
|
||||
val moduleInfo = moduleInfos[module] ?: error("No module info found for $module")
|
||||
val moduleStep = moduleInfo.steps.getValue(projStepId)
|
||||
val deletedFiles = mutableSetOf<String>()
|
||||
for (modification in moduleStep.modifications) {
|
||||
modification.execute(moduleTestDir, moduleSourceDir) { deletedFiles.add(it.name) }
|
||||
}
|
||||
|
||||
val expectedFileStats = moduleStep.expectedFileStats.toMutableMap()
|
||||
if (deletedFiles.isNotEmpty()) {
|
||||
val removedFiles = expectedFileStats[DirtyFileState.REMOVED_FILE.str] ?: emptySet()
|
||||
expectedFileStats[DirtyFileState.REMOVED_FILE.str] = removedFiles + deletedFiles
|
||||
modification.execute(moduleTestDir, moduleSourceDir) {}
|
||||
}
|
||||
|
||||
val outputKlibFile = resolveModuleArtifact(module, buildDir)
|
||||
@@ -196,7 +189,7 @@ abstract class AbstractInvalidationTest(private val targetBackend: TargetBackend
|
||||
module.safeModuleName,
|
||||
outputKlibFile.canonicalPath,
|
||||
friends.map { it.canonicalPath },
|
||||
expectedFileStats,
|
||||
moduleStep.expectedFileStats,
|
||||
dtsFile?.readText()
|
||||
)
|
||||
}
|
||||
|
||||
Vendored
+1
@@ -25,5 +25,6 @@ STEP 6:
|
||||
modifications:
|
||||
D : l1b.kt
|
||||
removed inverse depends: l1a.kt
|
||||
removed file: l1b.kt
|
||||
STEP 7:
|
||||
updated exports: l1a.kt
|
||||
|
||||
Vendored
+2
-2
@@ -1,11 +1,11 @@
|
||||
STEP 0:
|
||||
added file: l1a.kt, l1b.kt
|
||||
STEP 1:
|
||||
updated exports: l1b.kt, l1a.kt
|
||||
added file: l1b.kt, l1a.kt
|
||||
STEP 2:
|
||||
updated exports: l1a.kt
|
||||
STEP 3:
|
||||
removed inverse depends: l1b.kt, l1a.kt
|
||||
added file: l1b.kt, l1a.kt
|
||||
STEP 4:
|
||||
modifications:
|
||||
U : l1a.4.kt -> l1a.kt
|
||||
|
||||
Vendored
+2
-2
@@ -7,7 +7,7 @@ STEP 1:
|
||||
dependencies: lib1, lib2
|
||||
modifications:
|
||||
U : m.1.kt -> m.kt
|
||||
modified ir: m.kt
|
||||
added file: m.kt
|
||||
STEP 2:
|
||||
dependencies: lib1, lib2
|
||||
updated imports: m.kt
|
||||
@@ -15,6 +15,6 @@ STEP 3:
|
||||
dependencies: lib1
|
||||
modifications:
|
||||
U : m.0.kt -> m.kt
|
||||
modified ir: m.kt
|
||||
added file: m.kt
|
||||
STEP 4:
|
||||
dependencies: lib1
|
||||
|
||||
+1
@@ -42,6 +42,7 @@ STEP 7:
|
||||
D : l2pair.kt
|
||||
D : l2string.kt
|
||||
D : l2func.kt
|
||||
removed file: l2pair.kt, l2string.kt, l2func.kt
|
||||
STEP 8:
|
||||
dependencies: lib1
|
||||
updated imports: l2int.kt
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ STEP 7:
|
||||
STEP 8:
|
||||
modifications:
|
||||
U : l1.0.kt -> l1.kt
|
||||
modified ir: l1.kt
|
||||
added file: l1.kt
|
||||
STEP 9:
|
||||
modifications:
|
||||
U : l1.1.kt -> l1.kt
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ STEP 8:
|
||||
dependencies: lib1, libProxy
|
||||
modifications:
|
||||
U : m.proxy.kt -> m.kt
|
||||
modified ir: m.kt
|
||||
added file: m.kt
|
||||
STEP 9..13:
|
||||
dependencies: lib1, libProxy
|
||||
updated imports: m.kt
|
||||
|
||||
Vendored
+1
@@ -3,6 +3,7 @@ STEP 0:
|
||||
STEP 1:
|
||||
modifications:
|
||||
D : l12.kt
|
||||
removed file: l12.kt
|
||||
STEP 2:
|
||||
modifications:
|
||||
U : l12_n.2.kt -> l12_n.kt
|
||||
|
||||
Vendored
+1
@@ -12,3 +12,4 @@ STEP 2:
|
||||
modifications:
|
||||
D : l22.kt
|
||||
removed direct depends: l21.kt
|
||||
removed file: l22.kt
|
||||
|
||||
+1
@@ -3,3 +3,4 @@ STEP 0:
|
||||
STEP 1:
|
||||
modifications:
|
||||
D : l1_1.kt
|
||||
removed file: l1_1.kt
|
||||
|
||||
+1
@@ -5,3 +5,4 @@ STEP 1:
|
||||
dependencies: lib1
|
||||
modifications:
|
||||
D : l2_1.kt
|
||||
removed file: l2_1.kt
|
||||
|
||||
+1
@@ -3,4 +3,5 @@ STEP 0:
|
||||
STEP 1:
|
||||
modifications:
|
||||
D : l1_1.kt
|
||||
removed file: l1_1.kt
|
||||
STEP 2:
|
||||
|
||||
+1
@@ -5,3 +5,4 @@ STEP 1:
|
||||
D : l1.kt
|
||||
U : l1.kt -> l1_new.kt
|
||||
added file: l1_new.kt
|
||||
removed file: l1.kt
|
||||
|
||||
+1
-3
@@ -7,6 +7,4 @@ STEP 2:
|
||||
modifications:
|
||||
U : l1.2.kt -> l1.kt
|
||||
modified ir: l1.kt
|
||||
STEP 3:
|
||||
removed file: l1.kt
|
||||
STEP 4..5:
|
||||
STEP 3..5:
|
||||
|
||||
+1
-3
@@ -2,9 +2,7 @@ STEP 0:
|
||||
modifications:
|
||||
U : l1.0.kt -> l1.kt
|
||||
added file: l1.kt
|
||||
STEP 1:
|
||||
removed file: l1.kt
|
||||
STEP 2:
|
||||
STEP 1..2:
|
||||
STEP 3:
|
||||
modifications:
|
||||
U : l1.3.kt -> l1.kt
|
||||
|
||||
+2
-2
@@ -3,13 +3,13 @@ STEP 0:
|
||||
added file: m.kt
|
||||
STEP 1:
|
||||
dependencies: lib1-new
|
||||
removed direct depends: m.kt
|
||||
added file: m.kt
|
||||
STEP 2:
|
||||
dependencies: lib1-new
|
||||
updated imports: m.kt
|
||||
STEP 3:
|
||||
dependencies: lib1
|
||||
removed direct depends: m.kt
|
||||
added file: m.kt
|
||||
STEP 4..5:
|
||||
dependencies: lib1
|
||||
updated imports: m.kt
|
||||
|
||||
+2
-2
@@ -5,12 +5,12 @@ STEP 0:
|
||||
added file: l2.kt
|
||||
STEP 1:
|
||||
dependencies: lib1-a, lib1-b, lib1-c
|
||||
removed direct depends: l2.kt
|
||||
added file: l2.kt
|
||||
STEP 2..3:
|
||||
dependencies: lib1-a, lib1-b, lib1-c
|
||||
updated imports: l2.kt
|
||||
STEP 4:
|
||||
dependencies: lib1
|
||||
removed direct depends: l2.kt
|
||||
added file: l2.kt
|
||||
STEP 5:
|
||||
dependencies: lib1
|
||||
|
||||
+8
-2
@@ -1,7 +1,13 @@
|
||||
STEP 0:
|
||||
dependencies: lib1, lib2
|
||||
added file: m.kt
|
||||
STEP 1..3:
|
||||
STEP 1:
|
||||
dependencies: lib1-a, lib1-b, lib1-c, lib2
|
||||
STEP 4..5:
|
||||
added file: m.kt
|
||||
STEP 2..3:
|
||||
dependencies: lib1-a, lib1-b, lib1-c, lib2
|
||||
STEP 4:
|
||||
dependencies: lib1, lib2
|
||||
added file: m.kt
|
||||
STEP 5:
|
||||
dependencies: lib1, lib2
|
||||
|
||||
+2
-2
@@ -5,13 +5,13 @@ STEP 0:
|
||||
dirty js: lib1, lib2, main
|
||||
STEP 1:
|
||||
libs: lib1-a, lib1-b, lib1-c, lib2, main
|
||||
dirty js: lib1-a, lib1-b, lib1-c, lib2
|
||||
dirty js: lib1-a, lib1-b, lib1-c, main, lib2
|
||||
STEP 2..3:
|
||||
libs: lib1-a, lib1-b, lib1-c, lib2, main
|
||||
dirty js: lib1-b, lib2
|
||||
STEP 4:
|
||||
libs: lib1, lib2, main
|
||||
dirty js: lib1, lib2
|
||||
dirty js: lib1, lib2, main
|
||||
STEP 5:
|
||||
libs: lib1, lib2, main
|
||||
dirty js: lib1
|
||||
|
||||
+2
@@ -32,6 +32,7 @@ STEP 5:
|
||||
U : l2b.5.kt -> l2b.kt
|
||||
D : l2a.kt
|
||||
modified ir: l2b.kt
|
||||
removed file: l2a.kt
|
||||
STEP 6:
|
||||
dependencies: lib1
|
||||
modifications:
|
||||
@@ -43,6 +44,7 @@ STEP 7:
|
||||
U : l2a.7.kt -> l2a.kt
|
||||
D : l2b.kt
|
||||
added file: l2a.kt
|
||||
removed file: l2b.kt
|
||||
STEP 8:
|
||||
dependencies: lib1
|
||||
modifications:
|
||||
|
||||
Vendored
+1
@@ -26,6 +26,7 @@ STEP 5:
|
||||
U : l2b.5.kt -> l2b.kt
|
||||
D : l2a.kt
|
||||
modified ir: l2b.kt
|
||||
removed file: l2a.kt
|
||||
STEP 6:
|
||||
dependencies: lib1
|
||||
updated imports: l2b.kt
|
||||
|
||||
Reference in New Issue
Block a user