Fix lock expired errors

This commit is contained in:
Zaid Humaimidi committed 2024-03-11 11:04:49 -07:00
1 parent 6962cedba9
commit 450fc6fe53
3 files changed
+20 -5

No files matched your search

+1
View File
@@ -69,6 +69,7 @@ if (!cluster.worker) {
onClientError: cwmp.onClientError, onClientError: cwmp.onClientError,
timeout: 30000, timeout: 30000,
keepAliveTimeout: 0, keepAliveTimeout: 0,
requestTimeout: cwmp.REQUEST_TIMEOUT,
}; };
// Need this for Node < 15 // Need this for Node < 15
+15 -5
View File
@@ -58,6 +58,10 @@ const REALM = "GenieACS";
const MAX_CYCLES = 4; const MAX_CYCLES = 4;
const MAX_CONCURRENT_REQUESTS = +config.get("MAX_CONCURRENT_REQUESTS"); const MAX_CONCURRENT_REQUESTS = +config.get("MAX_CONCURRENT_REQUESTS");
const MAX_SESSION_DURATION = 300000;
const LOCK_REFRESH_INTERVAL = 10000;
export const REQUEST_TIMEOUT = 10000;
const currentSessions = new WeakMap<Socket, SessionContext>(); const currentSessions = new WeakMap<Socket, SessionContext>();
const sessionsNonces = new WeakMap<Socket, string>(); const sessionsNonces = new WeakMap<Socket, string>();
@@ -207,10 +211,10 @@ async function writeResponse(
sessionContext.lastActivity = now; sessionContext.lastActivity = now;
currentSessions.set(connection, sessionContext); currentSessions.set(connection, sessionContext);
if (now >= sessionContext.extendLock) { if (now >= sessionContext.extendLock) {
sessionContext.extendLock = now + 10000; sessionContext.extendLock = now + LOCK_REFRESH_INTERVAL;
const lockToken = await lock.acquireLock( const lockToken = await lock.acquireLock(
`cwmp_session_${sessionContext.deviceId}`, `cwmp_session_${sessionContext.deviceId}`,
sessionContext.timeout * 1000 + 15000, sessionContext.timeout * 1000 + LOCK_REFRESH_INTERVAL + REQUEST_TIMEOUT,
0, 0,
`cwmp_session_${sessionContext.sessionId}`, `cwmp_session_${sessionContext.sessionId}`,
); );
@@ -865,7 +869,12 @@ async function sendAcsRequest(
// When socket closes, store active sessions in cache // When socket closes, store active sessions in cache
export async function onConnection(socket: Socket): Promise<void> { export async function onConnection(socket: Socket): Promise<void> {
await once(socket, "close", 300000); try {
await once(socket, "close", MAX_SESSION_DURATION);
} catch {
socket.destroy();
}
const sessionContext = currentSessions.get(socket); const sessionContext = currentSessions.get(socket);
if (!sessionContext) return; if (!sessionContext) return;
currentSessions.delete(socket); currentSessions.delete(socket);
@@ -1056,10 +1065,11 @@ async function processRequest(
} }
} }
sessionContext.extendLock = sessionContext.timestamp + 10000; sessionContext.extendLock =
sessionContext.timestamp + LOCK_REFRESH_INTERVAL;
const lockToken = await lock.acquireLock( const lockToken = await lock.acquireLock(
`cwmp_session_${sessionContext.deviceId}`, `cwmp_session_${sessionContext.deviceId}`,
sessionContext.timeout * 1000 + 15000, sessionContext.timeout * 1000 + LOCK_REFRESH_INTERVAL + REQUEST_TIMEOUT,
0, 0,
`cwmp_session_${sessionContext.sessionId}`, `cwmp_session_${sessionContext.sessionId}`,
); );
+4
View File
@@ -41,6 +41,7 @@ interface ServerOptions {
ssl?: { key: string; cert: string }; ssl?: { key: string; cert: string };
timeout?: number; timeout?: number;
keepAliveTimeout?: number; keepAliveTimeout?: number;
requestTimeout?: number;
onConnection?: (socket: Socket) => void; onConnection?: (socket: Socket) => void;
onClientError?: (err: Error, socket: Socket) => void; onClientError?: (err: Error, socket: Socket) => void;
} }
@@ -152,6 +153,9 @@ export function start(
server.timeout = options.timeout || 0; server.timeout = options.timeout || 0;
if (options.keepAliveTimeout != null) if (options.keepAliveTimeout != null)
server.keepAliveTimeout = options.keepAliveTimeout; server.keepAliveTimeout = options.keepAliveTimeout;
if (options.requestTimeout != null)
server.requestTimeout = options.requestTimeout;
server.listen({ port: options.port, host: options.host }); server.listen({ port: options.port, host: options.host });
} }