Skip to content

Commit

Permalink
[starter][remDev] Subscribe to client launch only after backend is st…
Browse files Browse the repository at this point in the history
…arted

If we invoke getDriverDeferred and subscribe to IdeLaunchEvent before backend is started, we actually subscribe to the backend and start waiting for the client. Since backend and client both starts dev server it can easily take more than 3 minutes.

GitOrigin-RevId: e466bec1ae9a4961a9922bfc7e980e4afcc8ab7b
  • Loading branch information
MaXal authored and intellij-monorepo-bot committed Jul 12, 2024
1 parent f4529c2 commit 4203110
Showing 1 changed file with 9 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,28 @@ class RemDevDriverRunner : DriverRunner {
val ideBackendHandler = IDEBackendHandler(context, remoteDevDriverOptions)
val ideFrontendHandler = IDEFrontendHandler(backendContext = context, remoteDevDriverOptions)

val driver = DriverWithDetailedLogging(RemDevDriver(JmxHost(address = "127.0.0.1:${remoteDevDriverOptions.driverPort}")))
val driverDeferred = getDriverDeferred(ideFrontendHandler, driver)

EventsBus.subscribe("waiting backend start") { event: IdeLaunchEvent ->
ideFrontendHandler.handleBackendContext(event.runContext)
}
val backendRun = ideBackendHandler.run(commands, runTimeout, useStartupScript, launchName, expectedKill, expectedExitCode, collectNativeThreads, configure)

val driver = DriverWithDetailedLogging(RemDevDriver(JmxHost(address = "127.0.0.1:${remoteDevDriverOptions.driverPort}")))
val driverDeferred = getDriverDeferred(driver)
val frontendRun = ideFrontendHandler.runInBackground(launchName)

return runBlocking { RemoteDevBackgroundRun(frontendRun, backendRun.startResult, backendRun.driver, driverDeferred.await(), backendRun.process) }
}

private fun getDriverDeferred(ideFrontendHandler: IDEFrontendHandler, driver: DriverWithDetailedLogging): CompletableDeferred<Driver> {
private fun getDriverDeferred(driver: DriverWithDetailedLogging): CompletableDeferred<Driver> {
val driverDeferred = CompletableDeferred<Driver>()
EventsBus.subscribe(driverDeferred) { event: IdeLaunchEvent ->
EventsBus.subscribe("waiting client start") { event: IdeLaunchEvent ->
if (driverDeferred.isCompleted) return@subscribe
withTimeoutOrNull(3.minutes) {
ideFrontendHandler.handleBackendContext(event.runContext)
while (!driver.isConnected) {
delay(3.seconds)
}
driverDeferred.complete(driver)
} ?: driverDeferred.completeExceptionally(TimeoutException("Driver couldn't connect"))
} ?: driverDeferred.completeExceptionally(TimeoutException("Driver couldn't connect to frontend"))
}
return driverDeferred
}
Expand Down

0 comments on commit 4203110

Please sign in to comment.