From 8a44325327b9facf7ef396618ca658e4f3450328 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 17 Sep 2014 14:20:54 +0400 Subject: [PATCH] Log when libraries cache is dropped because of ProcessCanceledException Hope it can give insight on how often this happens --- .../caches/resolve/KotlinCacheService.kt | 12 +++++++-- .../caches/resolve/ModuleDependencyMapper.kt | 6 +---- .../caches/resolve/globalContextUtils.kt | 25 +++++++++++++++++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt index e3caa44d29c..afffc383ef4 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt @@ -67,11 +67,18 @@ public class KotlinCacheService(val project: Project) { dependencies: Collection, moduleFilter: (IdeaModuleInfo) -> Boolean, reuseDataFromCache: KotlinResolveCache? = null, - syntheticFiles: Collection = listOf() + syntheticFiles: Collection = listOf(), + logProcessCanceled: Boolean = false ): () -> CachedValueProvider.Result = { val analyzerFacade = AnalyzerFacadeProvider.getAnalyzerFacade(platform) val delegateResolverProvider = reuseDataFromCache?.moduleResolverProvider ?: EmptyModuleResolverProvider - val moduleResolverProvider = createModuleResolverProvider(project, analyzerFacade, syntheticFiles, delegateResolverProvider, moduleFilter) + val globalContext = (delegateResolverProvider as? ModuleResolverProviderImpl)?.globalContext + ?.withCompositeExceptionTrackerUnderSameLock() + ?: GlobalContext(logProcessCanceled) + + val moduleResolverProvider = createModuleResolverProvider( + project, globalContext, analyzerFacade, syntheticFiles, delegateResolverProvider, moduleFilter + ) val allDependencies = dependencies + listOf(moduleResolverProvider.exceptionTracker) CachedValueProvider.Result.create(moduleResolverProvider, allDependencies) } @@ -81,6 +88,7 @@ public class KotlinCacheService(val project: Project) { private inner class GlobalCache(platform: TargetPlatform) { val librariesCache = KotlinResolveCache( project, globalResolveSessionProvider(platform, + logProcessCanceled = true, moduleFilter = { it.isLibraryClasses() }, dependencies = listOf(ProjectRootModificationTracker.getInstance(project))) ) diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt index 951f76500d7..76712cba066 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt @@ -17,7 +17,6 @@ package org.jetbrains.jet.plugin.caches.resolve import com.intellij.openapi.project.Project -import org.jetbrains.jet.context.GlobalContext import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.module.ModuleManager import org.jetbrains.jet.utils.keysToMap @@ -38,6 +37,7 @@ import org.jetbrains.jet.context.GlobalContextImpl fun createModuleResolverProvider( project: Project, + globalContext: GlobalContextImpl, analyzerFacade: AnalyzerFacade, syntheticFiles: Collection, delegateProvider: ModuleResolverProvider, @@ -46,10 +46,6 @@ fun createModuleResolverProvider( val allModuleInfos = collectAllModuleInfosFromIdeaModel(project).toHashSet() - val globalContext = - (delegateProvider as? ModuleResolverProviderImpl)?.globalContext?.withCompositeExceptionTrackerUnderSameLock() - ?: GlobalContext() - val syntheticFilesByModule = syntheticFiles.groupBy { it.getModuleInfo() } val syntheticFilesModules = syntheticFilesByModule.keySet() allModuleInfos.addAll(syntheticFilesModules) diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/globalContextUtils.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/globalContextUtils.kt index a695bcc07bf..11e3c929d0f 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/globalContextUtils.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/globalContextUtils.kt @@ -19,6 +19,8 @@ package org.jetbrains.jet.plugin.caches.resolve import org.jetbrains.jet.context.GlobalContextImpl import org.jetbrains.jet.storage.LockBasedStorageManager import org.jetbrains.jet.storage.ExceptionTracker +import com.intellij.openapi.progress.ProcessCanceledException +import com.intellij.openapi.diagnostic.Logger fun GlobalContextImpl.withCompositeExceptionTrackerUnderSameLock(): GlobalContextImpl { val newExceptionTracker = CompositeExceptionTracker(this.exceptionTracker) @@ -26,8 +28,27 @@ fun GlobalContextImpl.withCompositeExceptionTrackerUnderSameLock(): GlobalContex return GlobalContextImpl(newStorageManager, newExceptionTracker) } -private class CompositeExceptionTracker(val delegate: ExceptionTracker): ExceptionTracker() { +private class CompositeExceptionTracker(val delegate: ExceptionTracker) : ExceptionTracker() { override fun getModificationCount(): Long { - return super.getModificationCount() + delegate.getModificationCount() + return super.getModificationCount() + delegate.getModificationCount() } +} + +private class ExceptionTrackerWithProcessCanceledReport() : ExceptionTracker() { + override fun handleException(throwable: Throwable): RuntimeException { + if (throwable is ProcessCanceledException) { + LOG.info("ProcessCancelException was thrown while analyzing libraries. Cache has to be rebuilt.") + } + throw super.handleException(throwable) + } + + + class object { + val LOG = Logger.getInstance(javaClass()) + } +} + +public fun GlobalContext(logProcessCanceled: Boolean): GlobalContextImpl { + val tracker = if (logProcessCanceled) ExceptionTrackerWithProcessCanceledReport() else ExceptionTracker() + return GlobalContextImpl(LockBasedStorageManager.createWithExceptionHandling(tracker), tracker) } \ No newline at end of file