diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt index 832830d2fe4..f30e95620f2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt @@ -175,9 +175,10 @@ class KotlinGradleFUSLogger : StartupActivity, DumbAware, Runnable { try { for (gradleUserHome in gradleUserDirs) { BuildSessionLogger.listProfileFiles(File(gradleUserHome, STATISTICS_FOLDER_NAME))?.forEach { statisticFile -> + var fileWasRead = true try { var previousEvent: MetricsContainer? = null - MetricsContainer.readFromFile(statisticFile) { metricContainer -> + fileWasRead = MetricsContainer.readFromFile(statisticFile) { metricContainer -> processMetricsContainer(metricContainer, previousEvent) previousEvent = metricContainer } @@ -185,7 +186,7 @@ class KotlinGradleFUSLogger : StartupActivity, DumbAware, Runnable { Logger.getInstance(KotlinFUSLogger::class.java) .info("Failed to process file ${statisticFile.absolutePath}: ${e.message}", e) } finally { - if (!statisticFile.delete()) { + if (fileWasRead && !statisticFile.delete()) { Logger.getInstance(KotlinFUSLogger::class.java) .warn("[FUS] Failed to delete file ${statisticFile.absolutePath}") } diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/FileRecordLogger.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/FileRecordLogger.kt index 610ec7bbf43..11e9a610162 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/FileRecordLogger.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/FileRecordLogger.kt @@ -24,7 +24,7 @@ class FileRecordLogger(file: File) : IRecordLogger { init { lock = try { - channel.lock() + channel.tryLock() ?: throw IOException("Could not acquire an exclusive lock of file ${file.name}") } catch (e: Exception) { channel.close() // wrap in order to unify with FileOverlappingException diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/MetricsContainer.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/MetricsContainer.kt index cf25013b1ae..27fafda1cb3 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/MetricsContainer.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/fileloggers/MetricsContainer.kt @@ -43,9 +43,9 @@ class MetricsContainer : IStatisticsValuesConsumer { private val numericalMetricsMap = NumericalMetrics.values().associateBy(NumericalMetrics::name) - fun readFromFile(file: File, consumer: (MetricsContainer) -> Unit) { + fun readFromFile(file: File, consumer: (MetricsContainer) -> Unit): Boolean { val channel = FileChannel.open(Paths.get(file.toURI()), StandardOpenOption.WRITE, StandardOpenOption.READ) - channel.lock() + channel.tryLock() ?: return false val inputStream = Channels.newInputStream(channel) try { @@ -86,6 +86,7 @@ class MetricsContainer : IStatisticsValuesConsumer { } finally { channel.close() } + return true } }