From 6ba68da81156eb33e0ef9884320631fcce48bd77 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 18 Dec 2015 19:25:00 +0100 Subject: [PATCH] Working around cancellation-related exception in case of different versions of daemon and client --- .../client/CompilerCallbackServicesFacadeServer.kt | 11 ++++++++++- .../daemon/common/CompilerCallbackServicesFacade.kt | 9 ++++++++- .../daemon/RemoteCompilationCanceledStatusClient.kt | 9 ++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt index 63243467ee3..60e4c5c5a0c 100644 --- a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt +++ b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt @@ -16,8 +16,10 @@ package org.jetbrains.kotlin.daemon.client +import com.intellij.openapi.progress.ProcessCanceledException import org.jetbrains.kotlin.daemon.common.CompilerCallbackServicesFacade import org.jetbrains.kotlin.daemon.common.LoopbackNetworkInterface +import org.jetbrains.kotlin.daemon.common.RmiFriendlyCompilationCancelledException import org.jetbrains.kotlin.daemon.common.SOCKET_ANY_FREE_PORT import org.jetbrains.kotlin.incremental.components.LookupInfo import org.jetbrains.kotlin.incremental.components.LookupTracker @@ -80,6 +82,13 @@ class CompilerCallbackServicesFacadeServer( override fun lookupTracker_isDoNothing(): Boolean = lookupTracker_isDoNothing override fun compilationCanceledStatus_checkCanceled() { - compilationCancelledStatus!!.checkCanceled() + try { + compilationCancelledStatus!!.checkCanceled() + } + catch (e: ProcessCanceledException) { + // avoid passing exceptions that may have different serialVersionUID on across rmi border + // TODO: doublecheck whether we need to distinguish different cancellation exceptions + throw RmiFriendlyCompilationCancelledException() + } } } diff --git a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt index 850645e860a..e5df09a4302 100644 --- a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt +++ b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.daemon.common import org.jetbrains.kotlin.incremental.components.LookupInfo import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto import org.jetbrains.kotlin.modules.TargetId +import java.io.Serializable import java.rmi.Remote import java.rmi.RemoteException @@ -81,7 +82,13 @@ interface CompilerCallbackServicesFacade : Remote { // ---------------------------------------------------- // CompilationCanceledStatus - @Throws(RemoteException::class) + @Throws(RemoteException::class, RmiFriendlyCompilationCancelledException::class) fun compilationCanceledStatus_checkCanceled(): Unit } + +class RmiFriendlyCompilationCancelledException: Exception(), Serializable { + companion object { + private val serialVersionUID: Long = 8228357578L // just a random number, but should never be changed to avoid deserialization problems + } +} \ No newline at end of file diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteCompilationCanceledStatusClient.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteCompilationCanceledStatusClient.kt index ae00af4aba4..163b1a763d4 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteCompilationCanceledStatusClient.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteCompilationCanceledStatusClient.kt @@ -20,6 +20,8 @@ import org.jetbrains.kotlin.progress.CompilationCanceledStatus import org.jetbrains.kotlin.daemon.common.CompilerCallbackServicesFacade import org.jetbrains.kotlin.daemon.common.DummyProfiler import org.jetbrains.kotlin.daemon.common.Profiler +import org.jetbrains.kotlin.daemon.common.RmiFriendlyCompilationCancelledException +import org.jetbrains.kotlin.progress.CompilationCanceledException import java.util.concurrent.TimeUnit val CANCELED_STATUS_CHECK_THRESHOLD_NS = TimeUnit.MILLISECONDS.toNanos(100) @@ -30,7 +32,12 @@ class RemoteCompilationCanceledStatusClient(val facade: CompilerCallbackServices val curNanos = System.nanoTime() if (curNanos - lastChecked > CANCELED_STATUS_CHECK_THRESHOLD_NS) { profiler.withMeasure(this) { - facade.compilationCanceledStatus_checkCanceled() + try { + facade.compilationCanceledStatus_checkCanceled() + } + catch (e: RmiFriendlyCompilationCancelledException) { + throw CompilationCanceledException() + } } lastChecked = curNanos }