Make "Path exists" check atomic

Review: https://jetbrains.team/p/ij/reviews/107079

This commit fixes flaky:
  java.util.concurrent.ExecutionException: java.nio.file.NoSuchFileException: /mnt/agent/temp/buildTmp/startupPerformanceTests14887929589063980070/perf-startup/cache/projects/unpacked/spring-petclinic-kotlin-master/.idea/kotlinc.xml
    at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
    at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096)
    at com.intellij.openapi.progress.util.BackgroundTaskUtil.lambda$createBackgroundTask$10(BackgroundTaskUtil.java:293)
    at com.intellij.openapi.util.ObjectTree.runWithTrace(ObjectTree.java:127)
    at com.intellij.openapi.util.ObjectTree.executeAll(ObjectTree.java:159)
    at com.intellij.openapi.util.Disposer.dispose(Disposer.java:264)
    at com.intellij.openapi.util.Disposer.dispose(Disposer.java:252)
    at com.intellij.openapi.progress.util.BackgroundTaskUtil.lambda$createBackgroundTask$11(BackgroundTaskUtil.java:315)
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
    at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1810)
    at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:248)
    at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:28)
    at com.intellij.util.concurrency.BoundedTaskExecutor$1.executeFirstTaskAndHelpQueue(BoundedTaskExecutor.java:221)
    at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:227)
    at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:210)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
    at java.base/java.lang.Thread.run(Thread.java:833)
  Caused by: java.nio.file.NoSuchFileException: /mnt/agent/temp/buildTmp/startupPerformanceTests14887929589063980070/perf-startup/cache/projects/unpacked/spring-petclinic-kotlin-master/.idea/kotlinc.xml
    at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
    at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:218)
    at java.base/java.nio.file.Files.newByteChannel(Files.java:380)
    at java.base/java.nio.file.Files.newByteChannel(Files.java:432)
    at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:422)
    at java.base/java.nio.file.Files.newInputStream(Files.java:160)
    at org.jetbrains.kotlin.idea.compiler.configuration.KotlinJpsPluginSettingsKt.fileIsNotEmpty(KotlinJpsPluginSettings.kt:271)
    at org.jetbrains.kotlin.idea.compiler.configuration.KotlinJpsPluginSettings$Companion.readFromKotlincXmlOrIpr(KotlinJpsPluginSettings.kt:129)
    at org.jetbrains.kotlin.idea.macros.KotlinBundledPathMacroContributor.getProjectPathMacros(KotlinBundledPathMacroContributor.kt:26)
    at com.intellij.openapi.components.impl.ProjectWidePathMacroContributor.getAllMacros(ProjectWidePathMacroContributor.java:38)
    at com.intellij.openapi.components.impl.ProjectPathMacroManager.getExpandMacroMap(ProjectPathMacroManager.java:49)
    at com.intellij.openapi.components.PathMacroManager.expandPath(PathMacroManager.java:120)
    at com.intellij.openapi.externalSystem.service.project.autoimport.ProjectAware.getSettingsFiles(ProjectAware.kt:40)
    at com.intellij.openapi.externalSystem.autoimport.ProjectSettingsTracker$SettingsFilesAsyncSupplier$cachingAsyncSupplier$1.get(ProjectSettingsTracker.kt:345)
    at kotlin.jvm.internal.PropertyReference0.invoke(PropertyReference0.java:35)
    at com.intellij.openapi.externalSystem.autoimport.settings.AsyncSupplier$Companion$blocking$1.supply(AsyncSupplier.kt:19)
    at com.intellij.openapi.externalSystem.autoimport.settings.BackgroundAsyncSupplier.supply$lambda$0(BackgroundAsyncSupplier.kt:18)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:186)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$13(CoreProgressManager.java:604)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:679)
    at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:635)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:603)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:60)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:173)
    at com.intellij.openapi.progress.util.BackgroundTaskUtil.lambda$submitTask$8(BackgroundTaskUtil.java:271)
    at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804)
    ... 12 more

This flaky failure is reported to be observable from time to time in
ijplatform_IjPlatform231_IntegrationPerformanceTestsKotlinEAPLinux

GitOrigin-RevId: c9f96f1fd279c93cdfaba2c4121acefefc4af464
This commit is contained in:
Nikita Bobko
2023-05-05 12:51:28 +02:00
committed by intellij-monorepo-bot
parent 3181c29d1e
commit de1d03a388

View File

@@ -24,8 +24,6 @@ import org.jetbrains.kotlin.config.SettingConstants.KOTLIN_JPS_PLUGIN_SETTINGS_S
import org.jetbrains.kotlin.config.toKotlinVersion
import org.jetbrains.kotlin.idea.base.plugin.KotlinBasePluginBundle
import java.nio.file.Path
import kotlin.io.path.bufferedReader
import kotlin.io.path.exists
@State(name = KOTLIN_JPS_PLUGIN_SETTINGS_SECTION, storages = [(Storage(SettingConstants.KOTLIN_COMPILER_SETTINGS_FILE))])
class KotlinJpsPluginSettings(project: Project) : BaseKotlinCompilerSettings<JpsPluginSettings>(project) {
@@ -126,10 +124,15 @@ class KotlinJpsPluginSettings(project: Project) : BaseKotlinCompilerSettings<Jps
* Please, prefer [getInstance] if possible.
*/
fun readFromKotlincXmlOrIpr(path: Path): JpsPluginSettings? {
return path.takeIf { it.fileIsNotEmpty() }
?.let { JDOMUtil.load(path) }
?.children
?.singleOrNull { it.getAttributeValue("name") == KotlinJpsPluginSettings::class.java.simpleName }
val root = try {
JDOMUtil.load(path)
} catch (ex: java.nio.file.NoSuchFileException) {
return null
} catch (ex: org.jdom.JDOMException) { // e.g. Unexpected End-of-input in prolog
return null
}
return root.children
.singleOrNull { it.getAttributeValue("name") == KotlinJpsPluginSettings::class.java.simpleName }
?.let { xmlElement ->
JpsPluginSettings().apply {
XmlSerializer.deserializeInto(this, xmlElement)
@@ -267,5 +270,3 @@ private fun showNotificationUnsupportedJpsPluginVersion(
.setImportant(true)
.notify(project)
}
fun Path.fileIsNotEmpty() = exists() && bufferedReader().use { it.readLine() != null }