[IC] Add methods to write without explicit registering in a transaction

#KT-49785 In Progress
This commit is contained in:
Alexander.Likhachev
2023-01-16 16:49:37 +01:00
committed by Space Team
parent 581bc89849
commit 3dcf5af4b0
7 changed files with 42 additions and 30 deletions
@@ -37,6 +37,24 @@ interface CompilationTransaction : Closeable {
fun markAsSuccessful() fun markAsSuccessful()
} }
fun CompilationTransaction.write(file: Path, writeAction: () -> Unit) {
registerAddedOrChangedFile(file)
writeAction()
}
fun CompilationTransaction.writeText(file: Path, text: String) {
writeBytes(file, text.toByteArray())
}
fun CompilationTransaction.writeBytes(file: Path, array: ByteArray) {
write(file) {
if (!Files.exists(file.parent)) {
Files.createDirectories(file.parent)
}
Files.write(file, array)
}
}
/** /**
* A dummy implementation of compilation transaction * A dummy implementation of compilation transaction
*/ */
@@ -72,9 +72,7 @@ open class IncrementalJsCache(
var header: ByteArray var header: ByteArray
get() = headerFile.readBytes() get() = headerFile.readBytes()
set(value) { set(value) {
icContext.transaction.registerAddedOrChangedFile(headerFile.toPath()) icContext.transaction.writeBytes(headerFile.toPath(), value)
cachesDir.mkdirs()
headerFile.writeBytes(value)
} }
override fun markDirty(removedAndCompiledSources: Collection<File>) { override fun markDirty(removedAndCompiledSources: Collection<File>) {
@@ -148,13 +148,7 @@ open class LookupStorage(
try { try {
if (size != oldSize) { if (size != oldSize) {
if (size > 0) { if (size > 0) {
icContext.transaction.registerAddedOrChangedFile(countersFile.toPath()) icContext.transaction.writeText(countersFile.toPath(), "$size\n0")
if (!countersFile.exists()) {
countersFile.parentFile.mkdirs()
countersFile.createNewFile()
}
countersFile.writeText("$size\n0")
} }
} }
} finally { } finally {
@@ -145,11 +145,12 @@ class AbiSnapshotImpl(override val protos: MutableMap<FqName, ProtoData>) : AbiS
} }
fun write(icContext: IncrementalCompilationContext, buildInfo: AbiSnapshot, file: File) { fun write(icContext: IncrementalCompilationContext, buildInfo: AbiSnapshot, file: File) {
icContext.transaction.registerAddedOrChangedFile(file.toPath()) icContext.transaction.write(file.toPath()) {
ObjectOutputStream(FileOutputStream(file)).use { ObjectOutputStream(FileOutputStream(file)).use {
it.writeAbiSnapshot(buildInfo) it.writeAbiSnapshot(buildInfo)
} }
} }
}
fun read(file: File): AbiSnapshot { fun read(file: File): AbiSnapshot {
return ObjectInputStream(FileInputStream(file)).use { return ObjectInputStream(FileInputStream(file)).use {
@@ -64,10 +64,11 @@ data class BuildDiffsStorage(val buildDiffs: List<BuildDifference>) {
return null return null
} }
fun writeToFile(file: File, storage: BuildDiffsStorage, reporter: ICReporter?) { fun writeToFile(icContext: IncrementalCompilationContext, file: File, storage: BuildDiffsStorage) {
file.parentFile.mkdirs() file.parentFile.mkdirs()
try { try {
icContext.transaction.write(file.toPath()) {
ObjectOutputStream(file.outputStream().buffered()).use { output -> ObjectOutputStream(file.outputStream().buffered()).use { output ->
output.writeInt(CURRENT_VERSION) output.writeInt(CURRENT_VERSION)
@@ -77,8 +78,9 @@ data class BuildDiffsStorage(val buildDiffs: List<BuildDifference>) {
output.writeBuildDifference(diff) output.writeBuildDifference(diff)
} }
} }
}
} catch (e: IOException) { } catch (e: IOException) {
reporter?.info { "Could not write diff to file $file: $e" } icContext.reporter.info { "Could not write diff to file $file: $e" }
} }
} }
@@ -495,8 +495,7 @@ abstract class IncrementalCompilerRunner<
dirtySources.addAll(compiledSources) dirtySources.addAll(compiledSources)
allDirtySources.addAll(dirtySources) allDirtySources.addAll(dirtySources)
val text = allDirtySources.joinToString(separator = System.getProperty("line.separator")) { it.normalize().absolutePath } val text = allDirtySources.joinToString(separator = System.getProperty("line.separator")) { it.normalize().absolutePath }
transaction.registerAddedOrChangedFile(dirtySourcesSinceLastTimeFile.toPath()) transaction.writeText(dirtySourcesSinceLastTimeFile.toPath(), text)
dirtySourcesSinceLastTimeFile.writeText(text)
val generatedFiles = outputItemsCollector.outputs.map { val generatedFiles = outputItemsCollector.outputs.map {
it.toGeneratedFile(jvmMetadataVersionFromLanguageVersion) it.toGeneratedFile(jvmMetadataVersionFromLanguageVersion)
@@ -583,7 +582,7 @@ abstract class IncrementalCompilerRunner<
} }
val dirtyData = DirtyData(buildDirtyLookupSymbols, buildDirtyFqNames) val dirtyData = DirtyData(buildDirtyLookupSymbols, buildDirtyFqNames)
processChangesAfterBuild(compilationMode, currentBuildInfo, dirtyData, transaction) processChangesAfterBuild(icContext, compilationMode, currentBuildInfo, dirtyData)
return exitCode return exitCode
} }
@@ -615,10 +614,10 @@ abstract class IncrementalCompilerRunner<
open fun runWithNoDirtyKotlinSources(caches: CacheManager): Boolean = false open fun runWithNoDirtyKotlinSources(caches: CacheManager): Boolean = false
private fun processChangesAfterBuild( private fun processChangesAfterBuild(
icContext: IncrementalCompilationContext,
compilationMode: CompilationMode, compilationMode: CompilationMode,
currentBuildInfo: BuildInfo, currentBuildInfo: BuildInfo,
dirtyData: DirtyData, dirtyData: DirtyData,
transaction: CompilationTransaction,
) = reporter.measure(BuildTime.IC_WRITE_HISTORY_FILE) { ) = reporter.measure(BuildTime.IC_WRITE_HISTORY_FILE) {
val prevDiffs = BuildDiffsStorage.readFromFile(buildHistoryFile, reporter)?.buildDiffs ?: emptyList() val prevDiffs = BuildDiffsStorage.readFromFile(buildHistoryFile, reporter)?.buildDiffs ?: emptyList()
val newDiff = if (compilationMode is CompilationMode.Incremental) { val newDiff = if (compilationMode is CompilationMode.Incremental) {
@@ -628,8 +627,7 @@ abstract class IncrementalCompilerRunner<
BuildDifference(currentBuildInfo.startTS, false, emptyDirtyData) BuildDifference(currentBuildInfo.startTS, false, emptyDirtyData)
} }
transaction.registerAddedOrChangedFile(buildHistoryFile.toPath()) BuildDiffsStorage.writeToFile(icContext, buildHistoryFile, BuildDiffsStorage(prevDiffs + newDiff))
BuildDiffsStorage.writeToFile(buildHistoryFile, BuildDiffsStorage(prevDiffs + newDiff), reporter)
} }
companion object { companion object {
@@ -28,6 +28,7 @@ import java.util.*
class BuildDiffsStorageTest { class BuildDiffsStorageTest {
lateinit var storageFile: File lateinit var storageFile: File
private val random = Random(System.currentTimeMillis()) private val random = Random(System.currentTimeMillis())
private val icContext = IncrementalCompilationContext(null)
@Before @Before
fun setUp() { fun setUp() {
@@ -54,7 +55,7 @@ class BuildDiffsStorageTest {
@Test @Test
fun writeReadSimple() { fun writeReadSimple() {
val diffs = BuildDiffsStorage(listOf(getRandomDiff())) val diffs = BuildDiffsStorage(listOf(getRandomDiff()))
BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) BuildDiffsStorage.writeToFile(icContext, storageFile, diffs)
val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null)
Assert.assertEquals(diffs.toString(), diffsDeserialized.toString()) Assert.assertEquals(diffs.toString(), diffsDeserialized.toString())
@@ -64,7 +65,7 @@ class BuildDiffsStorageTest {
fun writeReadMany() { fun writeReadMany() {
val generated = Array(20) { getRandomDiff() }.toList() val generated = Array(20) { getRandomDiff() }.toList()
val diffs = BuildDiffsStorage(generated) val diffs = BuildDiffsStorage(generated)
BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) BuildDiffsStorage.writeToFile(icContext, storageFile, diffs)
val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null) val diffsDeserialized = BuildDiffsStorage.readFromFile(storageFile, reporter = null)
val expected = generated.sortedBy { it.ts }.takeLast(BuildDiffsStorage.MAX_DIFFS_ENTRIES).toTypedArray() val expected = generated.sortedBy { it.ts }.takeLast(BuildDiffsStorage.MAX_DIFFS_ENTRIES).toTypedArray()
@@ -82,7 +83,7 @@ class BuildDiffsStorageTest {
@Test @Test
fun versionChanged() { fun versionChanged() {
val diffs = BuildDiffsStorage(listOf(getRandomDiff())) val diffs = BuildDiffsStorage(listOf(getRandomDiff()))
BuildDiffsStorage.writeToFile(storageFile, diffs, reporter = null) BuildDiffsStorage.writeToFile(icContext, storageFile, diffs)
val versionBackup = BuildDiffsStorage.CURRENT_VERSION val versionBackup = BuildDiffsStorage.CURRENT_VERSION
try { try {