Skip to content

Commit ae72817

Browse files
committed
Fix UI freeze when trying to refresh tokens offline
1 parent 9312719 commit ae72817

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix UI slowdown when Amazon Q Inline Suggestions are enabled, but token cannot be refreshed (#4868)"
4+
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import kotlinx.coroutines.async
2828
import kotlinx.coroutines.delay
2929
import kotlinx.coroutines.isActive
3030
import kotlinx.coroutines.launch
31+
import kotlinx.coroutines.withContext
3132
import software.amazon.awssdk.core.exception.SdkServiceException
3233
import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList
3334
import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException
@@ -46,6 +47,7 @@ import software.aws.toolkits.core.utils.getLogger
4647
import software.aws.toolkits.core.utils.info
4748
import software.aws.toolkits.core.utils.warn
4849
import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope
50+
import software.aws.toolkits.jetbrains.core.coroutines.getCoroutineBgContext
4951
import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope
5052
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
5153
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
@@ -82,7 +84,6 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileContextPr
8284
import software.aws.toolkits.jetbrains.utils.isInjectedText
8385
import software.aws.toolkits.jetbrains.utils.isQExpired
8486
import software.aws.toolkits.jetbrains.utils.notifyWarn
85-
import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
8687
import software.aws.toolkits.resources.message
8788
import software.aws.toolkits.telemetry.CodewhispererCompletionType
8889
import software.aws.toolkits.telemetry.CodewhispererSuggestionState
@@ -98,26 +99,43 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
9899
Disposer.register(this, codeInsightSettingsFacade)
99100
}
100101

102+
private var job: Job? = null
101103
fun showRecommendationsInPopup(
102104
editor: Editor,
103105
triggerTypeInfo: TriggerTypeInfo,
104106
latencyContext: LatencyContext
107+
) {
108+
if (job == null || job?.isCompleted == true) {
109+
job = cs.launch(getCoroutineBgContext()) {
110+
doShowRecommendationsInPopup(editor, triggerTypeInfo, latencyContext)
111+
}
112+
}
113+
}
114+
115+
@RequiresEdt
116+
private suspend fun doShowRecommendationsInPopup(
117+
editor: Editor,
118+
triggerTypeInfo: TriggerTypeInfo,
119+
latencyContext: LatencyContext
105120
) {
106121
val project = editor.project ?: return
107122
if (!isCodeWhispererEnabled(project)) return
108123

109124
latencyContext.credentialFetchingStart = System.nanoTime()
110125

111126
if (isQExpired(project)) {
127+
// consider changing to only running once a ~minute since this is relatively expensive
112128
// say the connection is un-refreshable if refresh fails for 3 times
113129
val shouldReauth = if (refreshFailure < MAX_REFRESH_ATTEMPT) {
114-
pluginAwareExecuteOnPooledThread {
130+
val attempt = withContext(getCoroutineBgContext()) {
115131
promptReAuth(project)
116-
}.get().also { success ->
117-
if (!success) {
118-
refreshFailure++
119-
}
120132
}
133+
134+
if (!attempt) {
135+
refreshFailure++
136+
}
137+
138+
attempt
121139
} else {
122140
true
123141
}

0 commit comments

Comments
 (0)