Skip to content

Commit d56d345

Browse files
Copilotedvilme
andcommitted
Fix multiple LSP server handlers via concurrency guard and stop error handling
Co-authored-by: edvilme <5952839+edvilme@users.noreply.github.com>
1 parent 025c851 commit d56d345

2 files changed

Lines changed: 36 additions & 18 deletions

File tree

src/common/server.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,11 @@ export async function restartServer(
8686
): Promise<LanguageClient | undefined> {
8787
if (lsClient) {
8888
traceInfo(`Server: Stop requested`);
89-
await lsClient.stop();
89+
try {
90+
await lsClient.stop();
91+
} catch (ex) {
92+
traceError(`Server: Stop failed: ${ex}`);
93+
}
9094
_disposables.forEach((d) => d.dispose());
9195
_disposables = [];
9296
}

src/extension.ts

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,29 +48,43 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
4848
traceLog(`Module: ${serverInfo.module}`);
4949
traceVerbose(`Full Server Info: ${JSON.stringify(serverInfo)}`);
5050

51+
let isRestarting = false;
52+
let restartTimer: NodeJS.Timeout | undefined;
5153
const runServer = async () => {
52-
const interpreter = getInterpreterFromSetting(serverId);
53-
if (interpreter && interpreter.length > 0) {
54-
if (checkVersion(await resolveInterpreter(interpreter))) {
55-
traceVerbose(`Using interpreter from ${serverInfo.module}.interpreter: ${interpreter.join(' ')}`);
56-
lsClient = await restartServer(serverId, serverName, outputChannel, lsClient);
54+
if (isRestarting) {
55+
if (restartTimer) {
56+
clearTimeout(restartTimer);
5757
}
58+
restartTimer = setTimeout(runServer, 1000);
5859
return;
5960
}
61+
isRestarting = true;
62+
try {
63+
const interpreter = getInterpreterFromSetting(serverId);
64+
if (interpreter && interpreter.length > 0) {
65+
if (checkVersion(await resolveInterpreter(interpreter))) {
66+
traceVerbose(`Using interpreter from ${serverInfo.module}.interpreter: ${interpreter.join(' ')}`);
67+
lsClient = await restartServer(serverId, serverName, outputChannel, lsClient);
68+
}
69+
return;
70+
}
6071

61-
const interpreterDetails = await getInterpreterDetails();
62-
if (interpreterDetails.path) {
63-
traceVerbose(`Using interpreter from Python extension: ${interpreterDetails.path.join(' ')}`);
64-
lsClient = await restartServer(serverId, serverName, outputChannel, lsClient);
65-
return;
66-
}
72+
const interpreterDetails = await getInterpreterDetails();
73+
if (interpreterDetails.path) {
74+
traceVerbose(`Using interpreter from Python extension: ${interpreterDetails.path.join(' ')}`);
75+
lsClient = await restartServer(serverId, serverName, outputChannel, lsClient);
76+
return;
77+
}
6778

68-
traceError(
69-
'Python interpreter missing:\r\n' +
70-
'[Option 1] Select python interpreter using the ms-python.python.\r\n' +
71-
`[Option 2] Set an interpreter using "${serverId}.interpreter" setting.\r\n` +
72-
'Please use Python 3.8 or greater.',
73-
);
79+
traceError(
80+
'Python interpreter missing:\r\n' +
81+
'[Option 1] Select python interpreter using the ms-python.python.\r\n' +
82+
`[Option 2] Set an interpreter using "${serverId}.interpreter" setting.\r\n` +
83+
'Please use Python 3.8 or greater.',
84+
);
85+
} finally {
86+
isRestarting = false;
87+
}
7488
};
7589

7690
context.subscriptions.push(

0 commit comments

Comments
 (0)