Make closing artifact difference registry more robust

KT-16298
This commit is contained in:
Alexey Tsvetkov
2017-04-17 16:20:37 +03:00
parent b504f1eb45
commit e25060f8c9
2 changed files with 42 additions and 10 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.incremental.BuildCacheStorage
import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProvider
import org.jetbrains.kotlin.incremental.relativeToRoot
import org.jetbrains.kotlin.incremental.stackTraceStr
import java.io.File
internal class KotlinGradleBuildServices private constructor(gradle: Gradle): BuildAdapter() {
@@ -120,19 +121,45 @@ internal class KotlinGradleBuildServices private constructor(gradle: Gradle): Bu
}
}
if (workingDir.exists()) {
// The working directory may have been removed by the clean task.
// https://youtrack.jetbrains.com/issue/KT-16298
buildCacheStorage.flush(memoryCachesOnly = false)
}
buildCacheStorage.close()
closeArtifactDifferenceRegistry()
gradle.removeListener(this)
instance = null
log.kotlinDebug(DISPOSE_MESSAGE)
}
private fun closeArtifactDifferenceRegistry() {
var caughtError = false
try {
if (workingDir.exists()) {
// The working directory may have been removed by the clean task.
// https://youtrack.jetbrains.com/issue/KT-16298
buildCacheStorage.flush(memoryCachesOnly = false)
}
}
catch (e: Throwable) {
log.kotlinDebug { "Error trying to flush artifact difference registry: ${e.stackTraceStr}" }
caughtError = true
}
finally {
try {
buildCacheStorage.close()
}
catch (e: Throwable) {
log.kotlinDebug { "Error trying to close artifact difference registry: ${e.stackTraceStr}" }
caughtError = true
}
}
if (caughtError && workingDir.exists()) {
try {
workingDir.deleteRecursively()
}
catch (e: Throwable) {
log.kotlinDebug { "Error trying to delete kotlin-build $workingDir: ${e.stackTraceStr}" }
}
}
}
private fun getUsedMemoryKb(): Long? {
if (!log.isDebugEnabled) return null
@@ -100,8 +100,13 @@ internal class BuildCacheStorage(workingDir: File) : BasicMapsOwner(), ArtifactD
versionFile.delete()
}
override fun close() {
super.close()
override fun flush(memoryCachesOnly: Boolean) {
super.flush(memoryCachesOnly)
version.saveIfNeeded()
}
override fun close() {
super.close()
artifactDifferenceRegistry = null
}
}