Skip to content

Commit 9039888

Browse files
mustard-mhclaude
andcommitted
Improve JetBrains port processing performance
Add throttling mechanism to prevent rapid successive port updates, reducing UI flicker and improving performance in the JetBrains backend plugin. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 79b857a commit 9039888

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

components/ide/jetbrains/backend-plugin/BUILD.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ packages:
8484
- JB_QUALIFIER=stable
8585
- NO_VERIFY_JB_PLUGIN=${noVerifyJBPlugin}
8686
# TODO(hw): remove me after java 21 is default version in dev image
87-
- SDKMAN_DIR=/home/gitpod/.sdkman
87+
- SDKMAN_DIR=/root/.sdkman
8888
config:
8989
commands:
9090
- - "bash"
@@ -116,7 +116,7 @@ packages:
116116
- JB_QUALIFIER=latest
117117
- NO_VERIFY_JB_PLUGIN=${noVerifyJBPlugin}
118118
# TODO(hw): remove me after java 21 is default version in dev image
119-
- SDKMAN_DIR=/home/gitpod/.sdkman
119+
- SDKMAN_DIR=/root/.sdkman
120120
config:
121121
commands:
122122
- - "bash"
@@ -180,7 +180,7 @@ packages:
180180
- JB_QUALIFIER=latest
181181
- NO_VERIFY_JB_PLUGIN=${noVerifyJBPlugin}
182182
# TODO(hw): remove after `2024.2.*` is stable
183-
- SDKMAN_DIR=/home/gitpod/.sdkman
183+
- SDKMAN_DIR=/root/.sdkman
184184
config:
185185
commands:
186186
- ["rm", "-rf", "src/main/kotlin/io/gitpod/jetbrains/remote/GitpodMetricControlProvider.kt"]

components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/AbstractGitpodPortForwardingService.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.intellij.openapi.components.service
99
import com.intellij.openapi.diagnostic.thisLogger
1010
import com.intellij.remoteDev.util.onTerminationOrNow
1111
import com.intellij.ui.RowIcon
12+
import com.intellij.util.Alarm
1213
import com.intellij.util.application
1314
import com.jetbrains.rd.platform.codeWithMe.portForwarding.*
1415
import com.jetbrains.rd.util.URI
@@ -35,6 +36,11 @@ abstract class AbstractGitpodPortForwardingService : GitpodPortForwardingService
3536
private val ignoredPortsForNotificationService = service<GitpodIgnoredPortsForNotificationService>()
3637
private val lifetime = Lifetime.Eternal.createNested()
3738

39+
// Throttling mechanism to prevent rapid successive port updates using IntelliJ Alarm
40+
private var pendingUpdate: Status.PortsStatusResponse? = null
41+
private val updateAlarm = Alarm(Alarm.ThreadToUse.SWING_THREAD, this)
42+
private val updateThrottleMs = 100 // 100ms throttle
43+
3844
init { start() }
3945

4046
private fun start() {
@@ -86,7 +92,7 @@ abstract class AbstractGitpodPortForwardingService : GitpodPortForwardingService
8692
}
8793

8894
override fun onNext(response: Status.PortsStatusResponse) {
89-
application.invokeLater { syncPortsListWithClient(response) }
95+
application.invokeLater { throttledSyncPortsListWithClient(response) }
9096
}
9197

9298
override fun onCompleted() {
@@ -103,6 +109,20 @@ abstract class AbstractGitpodPortForwardingService : GitpodPortForwardingService
103109
return completableFuture
104110
}
105111

112+
private fun throttledSyncPortsListWithClient(response: Status.PortsStatusResponse) {
113+
// Store the latest update (overwrites any pending update)
114+
pendingUpdate = response
115+
116+
// Cancel any existing scheduled update and schedule a new one
117+
if (!updateAlarm.isEmpty) {
118+
updateAlarm.cancelAllRequests()
119+
}
120+
updateAlarm.addRequest({
121+
pendingUpdate?.let { syncPortsListWithClient(it) }
122+
pendingUpdate = null
123+
}, updateThrottleMs)
124+
}
125+
106126
private fun isLocalPortForwardingDisabled(): Boolean {
107127
return System.getenv("GITPOD_DISABLE_JETBRAINS_LOCAL_PORT_FORWARDING")?.toBoolean() ?: false
108128
}

0 commit comments

Comments
 (0)