From ab11fe82abd02097240d18f9071a7d530f707b22 Mon Sep 17 00:00:00 2001 From: Saby Varghese Date: Wed, 15 Feb 2023 18:57:58 +0530 Subject: [PATCH 1/3] added multi process support --- src/redisHelper.ts | 6 +++--- src/server.ts | 35 ++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/redisHelper.ts b/src/redisHelper.ts index c2e70ee..e1e0f33 100644 --- a/src/redisHelper.ts +++ b/src/redisHelper.ts @@ -10,11 +10,11 @@ dayjs.extend(UTC); dayjs.extend(Timezone); dayjs.extend(AdvancedFormat); -export const logConnectionCount = (language: string, status: ConnectionStatus) => { +export const logConnectionCount = (language: string, status: ConnectionStatus, connectionCounter?: number) => { const redisKey = `${CONNECTION_STATS}:${language}:${dayjs().tz('Asia/Kolkata').format('YYYY-MM-DDTHH:mm')}` const totalRedisKey = `${CONNECTION_STATS}:${language}` if (status === ConnectionStatus.ACTIVE) { - redis.hincrby(redisKey, ACTIVE, 1) + redis.hincrby(redisKey, ACTIVE, connectionCounter) } if (status === ConnectionStatus.LANGUAGE_SERVER_IN_USE) { redis.hincrby(redisKey, LANGUAGE_SERVER_IN_USE, 1) @@ -29,7 +29,7 @@ export const logConnectionCount = (language: string, status: ConnectionStatus) = redis.hincrby(totalRedisKey, INCOMING, 1) } if (status === ConnectionStatus.LIVE) { - redis.hincrby(redisKey, LIVE, 1) + redis.hincrby(redisKey, LIVE, connectionCounter) } const expiryTimeInSeconds = 60 * 60 * 6; redis.expire(redisKey, expiryTimeInSeconds, 'NX'); diff --git a/src/server.ts b/src/server.ts index 23c0ca8..30ff89f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -53,15 +53,21 @@ function toSocket(webSocket: ws): rpc.IWebSocket { } } const language: string = argv.language +const processCount: number = argv.count || 2 const langServer = languageServers[language] -let connection = null -let localConnection = rpcServer.createServerProcess(`${langServer[0]}LSP`, langServer[0], langServer.slice(1)); +let connectionCounter = 1 +let processCollection = [] +for (var i = 0; i < processCount; i++) { + processCollection.push(rpcServer.createServerProcess(`${langServer[0]}LSP - ${i}`, langServer[0], langServer.slice(1))) +} + setInterval(() => { - console.log("VALID CONNECTION:", connection != null) - if (connection != null) { - logConnectionCount(language, ConnectionStatus.ACTIVE) + const activeConnections = connectionCounter - 1; + console.log("VALID CONNECTION:", activeConnections) + if (activeConnections > 0) { + logConnectionCount(language, ConnectionStatus.ACTIVE, activeConnections) } - logConnectionCount(language, ConnectionStatus.LIVE) + logConnectionCount(language, ConnectionStatus.LIVE, processCount) }, 60000) wss.on('connection', (client: ws, request: http.IncomingMessage) => { if (!langServer || !langServer.length) { @@ -69,21 +75,24 @@ wss.on('connection', (client: ws, request: http.IncomingMessage) => { client.close(); return; } - if (connection != null) { + if (connectionCounter > processCount) { logConnectionCount(language, ConnectionStatus.LANGUAGE_SERVER_IN_USE) client.close(); return; } - let socket: rpc.IWebSocket = toSocket(client); - connection = rpcServer.createWebSocketConnection(socket); + const connectionId = connectionCounter - 1 + const socket: rpc.IWebSocket = toSocket(client); + const localConnection = processCollection[connectionId] + const connection = rpcServer.createWebSocketConnection(socket); rpcServer.forward(connection, localConnection); logConnectionCount(language, ConnectionStatus.INCOMING) - console.log("Forwarding new client"); + console.log("Forwarding new client: ", connectionId); + connectionCounter++; socket.onClose((code) => { - console.log('Client closed', code); + connectionCounter--; + console.log('Client closed: ', code, connectionId); logConnectionCount(language, ConnectionStatus.CLOSED) - connection = null; localConnection.dispose(); - localConnection = rpcServer.createServerProcess(`${langServer[0]}LSP`, langServer[0], langServer.slice(1)); + processCollection[connectionId] = rpcServer.createServerProcess(`${langServer[0]}LSP - ${connectionId}`, langServer[0], langServer.slice(1)) }); }); From b430c76516f3adc0e276400c01e45a46a56aab2a Mon Sep 17 00:00:00 2001 From: Saby Varghese Date: Tue, 21 Feb 2023 12:17:00 +0530 Subject: [PATCH 2/3] testing --- src/server.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/server.ts b/src/server.ts index 30ff89f..b9594cc 100644 --- a/src/server.ts +++ b/src/server.ts @@ -92,7 +92,5 @@ wss.on('connection', (client: ws, request: http.IncomingMessage) => { connectionCounter--; console.log('Client closed: ', code, connectionId); logConnectionCount(language, ConnectionStatus.CLOSED) - localConnection.dispose(); - processCollection[connectionId] = rpcServer.createServerProcess(`${langServer[0]}LSP - ${connectionId}`, langServer[0], langServer.slice(1)) }); }); From 42eac9862484032d65a7a35f83945f461ffacf81 Mon Sep 17 00:00:00 2001 From: Saby Varghese Date: Tue, 21 Feb 2023 12:32:32 +0530 Subject: [PATCH 3/3] index search --- src/server.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/server.ts b/src/server.ts index b9594cc..c54e8dd 100644 --- a/src/server.ts +++ b/src/server.ts @@ -57,10 +57,11 @@ const processCount: number = argv.count || 2 const langServer = languageServers[language] let connectionCounter = 1 let processCollection = [] +let processInUse = []; for (var i = 0; i < processCount; i++) { processCollection.push(rpcServer.createServerProcess(`${langServer[0]}LSP - ${i}`, langServer[0], langServer.slice(1))) + processInUse.push(false) } - setInterval(() => { const activeConnections = connectionCounter - 1; console.log("VALID CONNECTION:", activeConnections) @@ -75,15 +76,16 @@ wss.on('connection', (client: ws, request: http.IncomingMessage) => { client.close(); return; } - if (connectionCounter > processCount) { + if (connectionCounter > processCount || processInUse.indexOf(false) === -1) { logConnectionCount(language, ConnectionStatus.LANGUAGE_SERVER_IN_USE) client.close(); return; } - const connectionId = connectionCounter - 1 + const connectionId = processInUse.indexOf(false) const socket: rpc.IWebSocket = toSocket(client); const localConnection = processCollection[connectionId] const connection = rpcServer.createWebSocketConnection(socket); + processInUse[connectionId] = true rpcServer.forward(connection, localConnection); logConnectionCount(language, ConnectionStatus.INCOMING) console.log("Forwarding new client: ", connectionId); @@ -92,5 +94,6 @@ wss.on('connection', (client: ws, request: http.IncomingMessage) => { connectionCounter--; console.log('Client closed: ', code, connectionId); logConnectionCount(language, ConnectionStatus.CLOSED) + processInUse[connectionId] = false }); });