@@ -5,12 +5,22 @@ package software.aws.toolkits.jetbrains.services.amazonq.startup
5
5
6
6
import com.intellij.openapi.application.runInEdt
7
7
import com.intellij.openapi.project.Project
8
+ import com.intellij.openapi.project.waitForSmartMode
8
9
import com.intellij.openapi.startup.ProjectActivity
9
10
import 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
10
16
import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState
11
17
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
12
18
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory
13
19
import 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
14
24
import java.util.concurrent.atomic.AtomicBoolean
15
25
16
26
class AmazonQStartupActivity : ProjectActivity {
@@ -27,9 +37,40 @@ class AmazonQStartupActivity : ProjectActivity {
27
37
CodeWhispererExplorerActionManager .getInstance().setIsFirstRestartAfterQInstall(false )
28
38
}
29
39
}
30
-
40
+ startLsp(project)
31
41
if (runOnce.get()) return
32
42
emitUserState(project)
33
43
runOnce.set(true )
34
44
}
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
+ }
35
76
}
0 commit comments