@@ -5,12 +5,22 @@ package software.aws.toolkits.jetbrains.services.amazonq.startup
55
66import com.intellij.openapi.application.runInEdt
77import com.intellij.openapi.project.Project
8+ import com.intellij.openapi.project.waitForSmartMode
89import com.intellij.openapi.startup.ProjectActivity
910import com.intellij.openapi.wm.ToolWindowManager
11+ import kotlinx.coroutines.TimeoutCancellationException
12+ import kotlinx.coroutines.delay
13+ import kotlinx.coroutines.time.withTimeout
14+ import software.aws.toolkits.core.utils.getLogger
15+ import software.aws.toolkits.core.utils.warn
1016import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState
1117import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
1218import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory
1319import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
20+ import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhispererSettings
21+ import software.aws.toolkits.jetbrains.services.cwc.editor.context.project.ProjectContextController
22+ import java.lang.management.ManagementFactory
23+ import java.time.Duration
1424import java.util.concurrent.atomic.AtomicBoolean
1525
1626class AmazonQStartupActivity : ProjectActivity {
@@ -27,9 +37,40 @@ class AmazonQStartupActivity : ProjectActivity {
2737 CodeWhispererExplorerActionManager .getInstance().setIsFirstRestartAfterQInstall(false )
2838 }
2939 }
30-
40+ startLsp(project)
3141 if (runOnce.get()) return
3242 emitUserState(project)
3343 runOnce.set(true )
3444 }
45+
46+ private suspend fun startLsp (project : Project ) {
47+ // Automatically start the project context LSP after some delay when average CPU load is below 30%.
48+ // The CPU load requirement is to avoid competing with native JetBrains indexing and other CPU expensive OS processes
49+ // In the future we will decouple LSP start and indexing start to let LSP perform other tasks.
50+ if (CodeWhispererSettings .getInstance().isProjectContextEnabled()) {
51+ val startLspIndexingDuration = Duration .ofMinutes(30 )
52+ project.waitForSmartMode()
53+ try {
54+ withTimeout(startLspIndexingDuration) {
55+ while (true ) {
56+ val cpuUsage = ManagementFactory .getOperatingSystemMXBean().systemLoadAverage
57+ if (cpuUsage > 0 && cpuUsage < 30 ) {
58+ ProjectContextController .getInstance(project = project)
59+ break
60+ } else {
61+ delay(60_000 ) // Wait for 60 seconds
62+ }
63+ }
64+ }
65+ } catch (e: TimeoutCancellationException ) {
66+ LOG .warn { " Failed to start LSP server due to time out" }
67+ } catch (e: Exception ) {
68+ LOG .warn { " Failed to start LSP server" }
69+ }
70+ }
71+ }
72+
73+ companion object {
74+ private val LOG = getLogger<AmazonQStartupActivity >()
75+ }
3576}
0 commit comments