Skip to content

Commit 34efb2b

Browse files
LiGaCuJiatong Li
andauthored
fix(amazonq): properly deposit workspace context server resources on exit (#1647)
* fix(amazonq): cancel workspace context server initialization workflow on exit * fix(amazonq): cancel message queue consumer interval on exit * fix(amazonq): add check before start workspace context server init workflow --------- Co-authored-by: Jiatong Li <[email protected]>
1 parent 7ee1f2a commit 34efb2b

File tree

3 files changed

+42
-24
lines changed

3 files changed

+42
-24
lines changed

server/aws-lsp-codewhisperer/src/language-server/workspaceContext/workspaceContextServer.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,18 @@ import { AmazonQTokenServiceManager } from '../../shared/amazonQServiceManager/A
77
describe('WorkspaceContext Server', () => {
88
let features: TestFeatures
99
let server: Server
10+
let disposeServer: () => void
1011

1112
before(() => {
1213
features = new TestFeatures()
1314
server = WorkspaceContextServer()
15+
disposeServer = server(features)
1416
})
1517

1618
afterEach(() => {
1719
sinon.restore()
20+
disposeServer()
21+
features.dispose()
1822
})
1923

2024
describe('Initialization', () => {
@@ -35,10 +39,6 @@ describe('WorkspaceContext Server', () => {
3539
},
3640
} as InitializeParams)
3741

38-
// Create a stub for the static getInstance method
39-
const getInstanceStub = sinon.stub(AmazonQTokenServiceManager, 'getInstance')
40-
getInstanceStub.throws(new Error('Deliberate error to exit the test at onInitialized'))
41-
4242
await features.initialize(server)
4343

4444
// Verify that a warning was logged (indicating the workspaceIdentifier was generated)

server/aws-lsp-codewhisperer/src/language-server/workspaceContext/workspaceContextServer.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export const WorkspaceContextServer = (): Server => features => {
2626
let artifactManager: ArtifactManager
2727
let dependencyDiscoverer: DependencyDiscoverer
2828
let workspaceFolderManager: WorkspaceFolderManager
29+
let workflowInitializationInterval: NodeJS.Timeout
2930
let isWorkflowInitialized: boolean = false
3031
let isOptedIn: boolean = false
3132
let abTestingEvaluated = false
@@ -236,7 +237,10 @@ export const WorkspaceContextServer = (): Server => features => {
236237
* of workspace folders is updated using *artifactManager.updateWorkspaceFolders(workspaceFolders)* before
237238
* initializing again.
238239
*/
239-
setInterval(async () => {
240+
if (workflowInitializationInterval) {
241+
return
242+
}
243+
workflowInitializationInterval = setInterval(async () => {
240244
if (!isOptedIn) {
241245
return
242246
}
@@ -501,10 +505,13 @@ export const WorkspaceContextServer = (): Server => features => {
501505
logging.log('Workspace context server has been initialized')
502506

503507
return () => {
504-
workspaceFolderManager.clearAllWorkspaceResources().catch(error => {
505-
logging.warn(
506-
`Error while clearing workspace resources: ${error instanceof Error ? error.message : 'Unknown error'}`
507-
)
508-
})
508+
clearInterval(workflowInitializationInterval)
509+
if (workspaceFolderManager) {
510+
workspaceFolderManager.clearAllWorkspaceResources().catch(error => {
511+
logging.warn(
512+
`Error while clearing workspace resources: ${error instanceof Error ? error.message : 'Unknown error'}`
513+
)
514+
})
515+
}
509516
}
510517
}

server/aws-lsp-codewhisperer/src/language-server/workspaceContext/workspaceFolderManager.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,6 @@ export class WorkspaceFolderManager {
114114
remoteWorkspaceState: 'CREATION_PENDING',
115115
messageQueue: [],
116116
}
117-
118-
this.messageQueueConsumerInterval = setInterval(() => {
119-
if (this.workspaceState.webSocketClient && this.workspaceState.webSocketClient.isConnected()) {
120-
const message = this.workspaceState.messageQueue[0]
121-
if (message) {
122-
try {
123-
this.workspaceState.webSocketClient.send(message)
124-
this.workspaceState.messageQueue.shift()
125-
} catch (error) {
126-
this.logging.error(`Error sending message: ${error}`)
127-
}
128-
}
129-
}
130-
}, this.MESSAGE_PUBLISH_INTERVAL)
131117
}
132118

133119
/**
@@ -229,6 +215,7 @@ export class WorkspaceFolderManager {
229215

230216
async clearAllWorkspaceResources() {
231217
this.stopContinuousMonitoring()
218+
this.stopMessageQueueConsumer()
232219
this.resetRemoteWorkspaceId()
233220
this.workspaceState.webSocketClient?.destroyClient()
234221
this.dependencyDiscoverer.dispose()
@@ -333,6 +320,22 @@ export class WorkspaceFolderManager {
333320

334321
async initializeWorkspaceStatusMonitor() {
335322
this.logging.log(`Initializing workspace status check for workspace [${this.workspaceIdentifier}]`)
323+
324+
// Set up message queue consumer
325+
this.messageQueueConsumerInterval = setInterval(() => {
326+
if (this.workspaceState.webSocketClient && this.workspaceState.webSocketClient.isConnected()) {
327+
const message = this.workspaceState.messageQueue[0]
328+
if (message) {
329+
try {
330+
this.workspaceState.webSocketClient.send(message)
331+
this.workspaceState.messageQueue.shift()
332+
} catch (error) {
333+
this.logging.error(`Error sending message: ${error}`)
334+
}
335+
}
336+
}
337+
}, this.MESSAGE_PUBLISH_INTERVAL)
338+
336339
// Perform a one-time checkRemoteWorkspaceStatusAndReact first
337340
// Pass skipUploads as true since it would be handled by processNewWorkspaceFolders
338341
await this.checkRemoteWorkspaceStatusAndReact(true)
@@ -578,6 +581,14 @@ export class WorkspaceFolderManager {
578581
}
579582
}
580583

584+
private stopMessageQueueConsumer() {
585+
this.logging.log(`Stopping message queue consumer`)
586+
if (this.messageQueueConsumerInterval) {
587+
clearInterval(this.messageQueueConsumerInterval)
588+
this.messageQueueConsumerInterval = undefined
589+
}
590+
}
591+
581592
private async createNewWorkspace() {
582593
const createWorkspaceResult = await this.createWorkspace(this.workspaceIdentifier)
583594
const workspaceDetails = createWorkspaceResult.response

0 commit comments

Comments
 (0)