Log when libraries cache is dropped because of ProcessCanceledException

Hope it can give insight on how often this happens
This commit is contained in:
Pavel V. Talanov
2014-09-17 14:20:54 +04:00
parent 8d89ac897a
commit 8a44325327
3 changed files with 34 additions and 9 deletions
@@ -67,11 +67,18 @@ public class KotlinCacheService(val project: Project) {
dependencies: Collection<Any>, dependencies: Collection<Any>,
moduleFilter: (IdeaModuleInfo) -> Boolean, moduleFilter: (IdeaModuleInfo) -> Boolean,
reuseDataFromCache: KotlinResolveCache? = null, reuseDataFromCache: KotlinResolveCache? = null,
syntheticFiles: Collection<JetFile> = listOf() syntheticFiles: Collection<JetFile> = listOf(),
logProcessCanceled: Boolean = false
): () -> CachedValueProvider.Result<ModuleResolverProvider> = { ): () -> CachedValueProvider.Result<ModuleResolverProvider> = {
val analyzerFacade = AnalyzerFacadeProvider.getAnalyzerFacade(platform) val analyzerFacade = AnalyzerFacadeProvider.getAnalyzerFacade(platform)
val delegateResolverProvider = reuseDataFromCache?.moduleResolverProvider ?: EmptyModuleResolverProvider 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) val allDependencies = dependencies + listOf(moduleResolverProvider.exceptionTracker)
CachedValueProvider.Result.create(moduleResolverProvider, allDependencies) CachedValueProvider.Result.create(moduleResolverProvider, allDependencies)
} }
@@ -81,6 +88,7 @@ public class KotlinCacheService(val project: Project) {
private inner class GlobalCache(platform: TargetPlatform) { private inner class GlobalCache(platform: TargetPlatform) {
val librariesCache = KotlinResolveCache( val librariesCache = KotlinResolveCache(
project, globalResolveSessionProvider(platform, project, globalResolveSessionProvider(platform,
logProcessCanceled = true,
moduleFilter = { it.isLibraryClasses() }, moduleFilter = { it.isLibraryClasses() },
dependencies = listOf(ProjectRootModificationTracker.getInstance(project))) dependencies = listOf(ProjectRootModificationTracker.getInstance(project)))
) )
@@ -17,7 +17,6 @@
package org.jetbrains.jet.plugin.caches.resolve package org.jetbrains.jet.plugin.caches.resolve
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.jet.context.GlobalContext
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleManager
import org.jetbrains.jet.utils.keysToMap import org.jetbrains.jet.utils.keysToMap
@@ -38,6 +37,7 @@ import org.jetbrains.jet.context.GlobalContextImpl
fun createModuleResolverProvider( fun createModuleResolverProvider(
project: Project, project: Project,
globalContext: GlobalContextImpl,
analyzerFacade: AnalyzerFacade<ResolverForModule, JvmPlatformParameters>, analyzerFacade: AnalyzerFacade<ResolverForModule, JvmPlatformParameters>,
syntheticFiles: Collection<JetFile>, syntheticFiles: Collection<JetFile>,
delegateProvider: ModuleResolverProvider, delegateProvider: ModuleResolverProvider,
@@ -46,10 +46,6 @@ fun createModuleResolverProvider(
val allModuleInfos = collectAllModuleInfosFromIdeaModel(project).toHashSet() val allModuleInfos = collectAllModuleInfosFromIdeaModel(project).toHashSet()
val globalContext =
(delegateProvider as? ModuleResolverProviderImpl)?.globalContext?.withCompositeExceptionTrackerUnderSameLock()
?: GlobalContext()
val syntheticFilesByModule = syntheticFiles.groupBy { it.getModuleInfo() } val syntheticFilesByModule = syntheticFiles.groupBy { it.getModuleInfo() }
val syntheticFilesModules = syntheticFilesByModule.keySet() val syntheticFilesModules = syntheticFilesByModule.keySet()
allModuleInfos.addAll(syntheticFilesModules) allModuleInfos.addAll(syntheticFilesModules)
@@ -19,6 +19,8 @@ package org.jetbrains.jet.plugin.caches.resolve
import org.jetbrains.jet.context.GlobalContextImpl import org.jetbrains.jet.context.GlobalContextImpl
import org.jetbrains.jet.storage.LockBasedStorageManager import org.jetbrains.jet.storage.LockBasedStorageManager
import org.jetbrains.jet.storage.ExceptionTracker import org.jetbrains.jet.storage.ExceptionTracker
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.diagnostic.Logger
fun GlobalContextImpl.withCompositeExceptionTrackerUnderSameLock(): GlobalContextImpl { fun GlobalContextImpl.withCompositeExceptionTrackerUnderSameLock(): GlobalContextImpl {
val newExceptionTracker = CompositeExceptionTracker(this.exceptionTracker) val newExceptionTracker = CompositeExceptionTracker(this.exceptionTracker)
@@ -26,8 +28,27 @@ fun GlobalContextImpl.withCompositeExceptionTrackerUnderSameLock(): GlobalContex
return GlobalContextImpl(newStorageManager, newExceptionTracker) return GlobalContextImpl(newStorageManager, newExceptionTracker)
} }
private class CompositeExceptionTracker(val delegate: ExceptionTracker): ExceptionTracker() { private class CompositeExceptionTracker(val delegate: ExceptionTracker) : ExceptionTracker() {
override fun getModificationCount(): Long { override fun getModificationCount(): Long {
return super<ExceptionTracker>.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<ExceptionTrackerWithProcessCanceledReport>())
}
}
public fun GlobalContext(logProcessCanceled: Boolean): GlobalContextImpl {
val tracker = if (logProcessCanceled) ExceptionTrackerWithProcessCanceledReport() else ExceptionTracker()
return GlobalContextImpl(LockBasedStorageManager.createWithExceptionHandling(tracker), tracker)
} }