IJPL-149248: Manually register NettyChannelProvider

GitOrigin-RevId: 32e564a031965dc974667ba019158deba91530de
This commit is contained in:
Artem Aleksyuk
2024-06-26 18:59:41 +02:00
committed by intellij-monorepo-bot
parent 6898adbc14
commit 5f2a9248fd
3 changed files with 37 additions and 0 deletions

View File

@@ -20,6 +20,7 @@
<orderEntry type="module" module-name="intellij.platform.ide.util.io" />
<orderEntry type="library" scope="TEST" name="JUnit5" level="project" />
<orderEntry type="library" scope="TEST" name="jetbrains-annotations" level="project" />
<orderEntry type="module" module-name="intellij.platform.testFramework.junit5" scope="TEST" />
<orderEntry type="module-library">
<library name="grpc-inprocess" type="repository">
<properties include-transitive-deps="false" maven-id="io.grpc:grpc-inprocess:1.61.0">
@@ -39,5 +40,6 @@
</library>
</orderEntry>
<orderEntry type="module" module-name="intellij.libraries.grpc" />
<orderEntry type="module" module-name="intellij.libraries.grpc.netty.shaded" />
</component>
</module>

View File

@@ -4,12 +4,17 @@ package com.intellij.execution.process.mediator.client.launcher
import com.intellij.execution.process.mediator.client.ProcessMediatorClient
import com.intellij.execution.process.mediator.common.DaemonClientCredentials
import com.intellij.execution.process.mediator.daemon.ProcessMediatorServerDaemon
import com.intellij.openapi.Disposable
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.util.io.MultiCloseable
import com.intellij.util.io.runClosingOnFailure
import io.grpc.ManagedChannel
import io.grpc.ManagedChannelBuilder
import io.grpc.ManagedChannelRegistry
import io.grpc.inprocess.InProcessChannelBuilder
import io.grpc.inprocess.InProcessServerBuilder
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider
import io.grpc.stub.MetadataUtils
import kotlinx.coroutines.CoroutineScope
import java.io.Closeable
@@ -37,6 +42,7 @@ fun ProcessMediatorConnection.Companion.createDaemonConnection(
processHandle?.let {
registerCloseable { it.destroy() }
}
NettyChannelProviderRegistrationService.ensureChannelProviderRegistered()
val channel = ManagedChannelBuilder.forAddress(LOOPBACK_IP, port)
.usePlaintext()
.build().also(::registerCloseable)
@@ -76,3 +82,30 @@ private class ConnectionImpl(
) : ProcessMediatorConnection, Closeable, AutoCloseable by cleanup {
override fun toString(): String = "Connection(client=$client)"
}
/**
* [ManagedChannelRegistry.getDefaultRegistry] has the ability to discover available [io.grpc.ManagedChannelProvider] subclasses.
* However, [ManagedChannelRegistry]
* uses a classloader that has no access to [NettyChannelProvider],
* because intellij.libraries.grpc module does not depend on intellij.libraries.grpc.netty.shaded,
* so automatic discovery fails.
*/
@Service(Service.Level.APP)
private class NettyChannelProviderRegistrationService : Disposable {
private val registry = ManagedChannelRegistry.getDefaultRegistry()
private val channelProvider = NettyChannelProvider()
init {
registry.register(channelProvider)
}
override fun dispose() {
registry.deregister(channelProvider)
}
companion object {
fun ensureChannelProviderRegistered() {
service<NettyChannelProviderRegistrationService>()
}
}
}

View File

@@ -5,6 +5,7 @@ import com.intellij.execution.process.mediator.client.launcher.ProcessMediatorCo
import com.intellij.execution.process.mediator.client.launcher.startInProcessServer
import com.intellij.execution.process.mediator.client.rt.MediatedProcessTestMain
import com.intellij.openapi.util.io.FileUtil
import com.intellij.testFramework.junit5.TestApplication
import kotlinx.coroutines.*
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.*
@@ -20,6 +21,7 @@ import java.util.concurrent.CancellationException
import java.util.stream.Collectors
import java.util.stream.Stream
@TestApplication
open class ProcessMediatorTest {
private val deferred = CompletableDeferred<Unit>()
private val coroutineScope = CoroutineScope(deferred + CoroutineExceptionHandler { _, cause ->