[AutoSync] QD-10726 Qodana: run autoimport background tasks BackgroundAsyncSupplier in background, track them

(cherry picked from commit de898261d3086dc16103e4fcbaacddb62dd9daec)


(cherry picked from commit cebc463f092e0478c811a1963e6130625ce3198a)

IJ-CR-160378

GitOrigin-RevId: 0bef7f20a813560c972a5dd348f652ac8903c421
This commit is contained in:
Mikhail Shagvaliev
2025-04-02 13:02:40 +02:00
committed by intellij-monorepo-bot
parent f5a4051649
commit fdcab2ec1c
5 changed files with 36 additions and 12 deletions

View File

@@ -20,7 +20,8 @@ private val COMMON_ADDITIONAL_VM_OPTIONS = listOf(
"-Deslint.service.expiration.timeout.ms=5000",
"-Dphp.additional.library.manager.new.updater=true",
"-Dgradle.force.project.sdk.import=true", //workaround for https://youtrack.jetbrains.com/issue/IDEA-367680/The-module-SDK-isnt-always-specified
"-Dide.region.url.mapping.expiration.timeout=7200"
"-Dide.region.url.mapping.expiration.timeout=7200",
"-Dexternal.system.auto.import.headless.async=true",
)
private const val IS_EAP = false

View File

@@ -15,6 +15,7 @@ import com.intellij.openapi.externalSystem.autoimport.ExternalSystemModification
import com.intellij.openapi.externalSystem.autoimport.ExternalSystemProjectTrackerSettings.AutoReloadType
import com.intellij.openapi.externalSystem.autoimport.ExternalSystemRefreshStatus.SUCCESS
import com.intellij.openapi.externalSystem.autoimport.ProjectStatus.Stamp
import com.intellij.openapi.externalSystem.autoimport.settings.BackgroundAsyncSupplier
import com.intellij.openapi.externalSystem.autoimport.update.PriorityEatUpdate
import com.intellij.openapi.externalSystem.model.ProjectSystemId
import com.intellij.openapi.externalSystem.util.ExternalSystemActivityKey
@@ -25,7 +26,6 @@ import com.intellij.openapi.observable.operation.core.whenOperationStarted
import com.intellij.openapi.observable.properties.*
import com.intellij.openapi.observable.util.set
import com.intellij.openapi.observable.util.whenDisposed
import com.intellij.openapi.progress.impl.CoreProgressManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.registry.Registry
@@ -413,7 +413,7 @@ class AutoImportProjectTracker(
private val asyncChangesProcessingProperty = AtomicBooleanProperty(
!ApplicationManager.getApplication().isHeadlessEnvironment
|| CoreProgressManager.shouldKeepTasksAsynchronousInHeadlessMode()
|| BackgroundAsyncSupplier.isAsyncInHeadless()
)
private val isEnabledAutoReload: Boolean

View File

@@ -18,8 +18,8 @@ import com.intellij.openapi.externalSystem.autoimport.changes.FilesChangesListen
import com.intellij.openapi.externalSystem.autoimport.changes.NewFilesListener.Companion.whenNewFilesCreated
import com.intellij.openapi.externalSystem.autoimport.settings.AsyncSupplier
import com.intellij.openapi.externalSystem.autoimport.settings.BackgroundAsyncSupplier
import com.intellij.openapi.externalSystem.autoimport.settings.tracked
import com.intellij.openapi.externalSystem.service.ui.completion.cache.AsyncLocalCache
import com.intellij.openapi.externalSystem.util.ExternalSystemActivityKey
import com.intellij.openapi.externalSystem.util.calculateCrc
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.observable.operation.core.AtomicOperationTrace
@@ -31,7 +31,6 @@ import com.intellij.openapi.util.SimpleModificationTracker
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.backend.observation.trackActivityBlocking
import kotlinx.serialization.Serializable
import org.jetbrains.annotations.ApiStatus
import java.nio.file.Path
@@ -367,12 +366,11 @@ class ProjectSettingsTracker(
private val supplier = BackgroundAsyncSupplier.Builder(::getOrCollectSettingsFiles)
.shouldKeepTasksAsynchronous(::isAsyncChangesProcessing)
.build(backgroundExecutor)
.tracked(project)
override fun supply(parentDisposable: Disposable, consumer: (Set<String>) -> Unit) {
project.trackActivityBlocking(ExternalSystemActivityKey) {
supplier.supply(parentDisposable) {
consumer(it + settingsFilesStatus.get().oldCRC.keys)
}
supplier.supply(parentDisposable) {
consumer(it + settingsFilesStatus.get().oldCRC.keys)
}
}

View File

@@ -2,8 +2,12 @@
package com.intellij.openapi.externalSystem.autoimport.settings
import com.intellij.openapi.Disposable
import com.intellij.openapi.externalSystem.util.ExternalSystemActivityKey
import com.intellij.openapi.progress.impl.CoreProgressManager
import com.intellij.openapi.progress.util.BackgroundTaskUtil
import com.intellij.openapi.project.Project
import com.intellij.platform.backend.observation.trackActivityBlocking
import com.intellij.util.application
import org.jetbrains.annotations.ApiStatus
import java.util.concurrent.Executor
@@ -11,8 +15,14 @@ import java.util.concurrent.Executor
class BackgroundAsyncSupplier<R>(
private val supplier: AsyncSupplier<R>,
private val shouldKeepTasksAsynchronous: () -> Boolean,
private val backgroundExecutor: Executor
private val backgroundExecutor: Executor,
) : AsyncSupplier<R> {
companion object {
fun isAsyncInHeadless(): Boolean {
return CoreProgressManager.shouldKeepTasksAsynchronousInHeadlessMode() ||
java.lang.Boolean.getBoolean("external.system.auto.import.headless.async")
}
}
override fun supply(parentDisposable: Disposable, consumer: (R) -> Unit) {
if (shouldKeepTasksAsynchronous()) {
@@ -29,8 +39,10 @@ class BackgroundAsyncSupplier<R>(
constructor(supplier: () -> R) : this(AsyncSupplier.blocking(supplier))
private var shouldKeepTasksAsynchronous: () -> Boolean =
CoreProgressManager::shouldKeepTasksAsynchronous
private var shouldKeepTasksAsynchronous: () -> Boolean = {
val isHeadless = application.isUnitTestMode() || application.isHeadlessEnvironment()
!isHeadless || isAsyncInHeadless()
}
fun shouldKeepTasksAsynchronous(provider: () -> Boolean) = apply {
shouldKeepTasksAsynchronous = provider
@@ -40,4 +52,15 @@ class BackgroundAsyncSupplier<R>(
return BackgroundAsyncSupplier(supplier, shouldKeepTasksAsynchronous, backgroundExecutor)
}
}
}
@ApiStatus.Internal
fun <R> AsyncSupplier<R>.tracked(project: Project): AsyncSupplier<R> {
return object : AsyncSupplier<R> {
override fun supply(parentDisposable: Disposable, consumer: (R) -> Unit) {
project.trackActivityBlocking(ExternalSystemActivityKey) {
this@tracked.supply(parentDisposable, consumer)
}
}
}
}

View File

@@ -7,6 +7,7 @@ import com.intellij.openapi.externalSystem.autoimport.ProjectStatus.Stamp
import com.intellij.openapi.externalSystem.autoimport.changes.AsyncFileChangesListener.Companion.subscribeOnVirtualFilesChanges
import com.intellij.openapi.externalSystem.autoimport.changes.FilesChangesListener
import com.intellij.openapi.externalSystem.autoimport.settings.BackgroundAsyncSupplier
import com.intellij.openapi.externalSystem.autoimport.settings.tracked
import com.intellij.openapi.util.io.toCanonicalPath
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.idea.maven.buildtool.MavenSyncSpec
@@ -51,6 +52,7 @@ class MavenGeneralSettingsWatcher(
fun subscribeOnSettingsFileChanges(parentDisposable: Disposable) {
val filesProvider = BackgroundAsyncSupplier.Builder(::collectSettingsFiles)
.build(backgroundExecutor)
.tracked(manager.project)
subscribeOnVirtualFilesChanges(false, filesProvider, object : FilesChangesListener {
override fun onFileChange(stamp: Stamp, path: String, modificationStamp: Long, modificationType: ExternalSystemModificationType) {
val fileChangeMessage = "File change: $path, $modificationStamp, $modificationType"