Remove caching of tasks, faults and operations

No longer seems to provide significant performance benefit to justify the
drawback of the added code complexity and the additional DB write query.
This commit is contained in:
Zaid Humaimidi committed 2023-11-23 10:34:47 -08:00
1 parent d122b224b0
commit f4596db9f7
4 files changed
+6 -100

No files matched your search

-4
View File
@@ -367,7 +367,6 @@ export async function deleteDevice(deviceId: string): Promise<void> {
$regex: `^${common.escapeRegExp(deviceId)}\\:`, $regex: `^${common.escapeRegExp(deviceId)}\\:`,
}, },
}), }),
cache.del(`${deviceId}_tasks_faults_operations`),
]); ]);
} }
@@ -387,7 +386,6 @@ export async function deleteResource(
if (channel.startsWith("task_")) if (channel.startsWith("task_"))
proms.push(deleteTask(new ObjectId(channel.slice(5)))); proms.push(deleteTask(new ObjectId(channel.slice(5))));
await Promise.all(proms); await Promise.all(proms);
await cache.del(`${deviceId}_tasks_faults_operations`);
} else if (resource === "provisions") { } else if (resource === "provisions") {
await deleteProvision(id); await deleteProvision(id);
await cache.del("cwmp-local-cache-hash"); await cache.del("cwmp-local-cache-hash");
@@ -439,8 +437,6 @@ export async function postTasks(
}; };
} }
await cache.del(`${deviceId}_tasks_faults_operations`);
const status = await connectionRequest(deviceId, device); const status = await connectionRequest(deviceId, device);
if (status) { if (status) {
+6 -90
View File
@@ -53,10 +53,8 @@ import {
SessionContext, SessionContext,
AcsRequest, AcsRequest,
SessionFault, SessionFault,
Operation,
Fault, Fault,
Expression, Expression,
Task,
SoapMessage, SoapMessage,
InformRequest, InformRequest,
Preset, Preset,
@@ -768,8 +766,6 @@ async function nextRpc(sessionContext: SessionContext): Promise<void> {
} }
async function endSession(sessionContext: SessionContext): Promise<void> { async function endSession(sessionContext: SessionContext): Promise<void> {
let saveCache = sessionContext.cacheUntil != null;
if (sessionContext.provisions.length) { if (sessionContext.provisions.length) {
const fault = { const fault = {
code: "session_terminated", code: "session_terminated",
@@ -794,7 +790,6 @@ async function endSession(sessionContext: SessionContext): Promise<void> {
if (sessionContext.operationsTouched) { if (sessionContext.operationsTouched) {
for (const k of Object.keys(sessionContext.operationsTouched)) { for (const k of Object.keys(sessionContext.operationsTouched)) {
saveCache = true;
if (sessionContext.operations[k]) { if (sessionContext.operations[k]) {
promises.push( promises.push(
saveOperation( saveOperation(
@@ -810,7 +805,6 @@ async function endSession(sessionContext: SessionContext): Promise<void> {
} }
if (sessionContext.doneTasks?.length) { if (sessionContext.doneTasks?.length) {
saveCache = true;
promises.push( promises.push(
clearTasks(sessionContext.deviceId, sessionContext.doneTasks) clearTasks(sessionContext.deviceId, sessionContext.doneTasks)
); );
@@ -818,7 +812,6 @@ async function endSession(sessionContext: SessionContext): Promise<void> {
if (sessionContext.faultsTouched) { if (sessionContext.faultsTouched) {
for (const k of Object.keys(sessionContext.faultsTouched)) { for (const k of Object.keys(sessionContext.faultsTouched)) {
saveCache = true;
if (sessionContext.faults[k]) { if (sessionContext.faults[k]) {
sessionContext.faults[k].retries = sessionContext.retries[k]; sessionContext.faults[k].retries = sessionContext.retries[k];
promises.push( promises.push(
@@ -830,18 +823,6 @@ async function endSession(sessionContext: SessionContext): Promise<void> {
} }
} }
if (saveCache) {
promises.push(
cacheDueTasksAndFaultsAndOperations(
sessionContext.deviceId,
sessionContext.tasks,
sessionContext.faults,
sessionContext.operations,
sessionContext.cacheUntil
)
);
}
await Promise.all(promises); await Promise.all(promises);
await lock.releaseLock( await lock.releaseLock(
`cwmp_session_${sessionContext.deviceId}`, `cwmp_session_${sessionContext.deviceId}`,
@@ -987,66 +968,6 @@ setInterval(() => {
stats.initiatedSessions = 0; stats.initiatedSessions = 0;
}, 10000).unref(); }, 10000).unref();
async function getDueTasksAndFaultsAndOperations(
deviceId,
timestamp
): Promise<{
tasks: Task[];
faults: { [channel: string]: SessionFault };
operations: { [commandKey: string]: Operation };
ttl: number;
}> {
const res = await cache.get(`${deviceId}_tasks_faults_operations`);
if (res) {
const resParsed = JSON.parse(res);
return {
tasks: resParsed.tasks || [],
faults: resParsed.faults || {},
operations: resParsed.operations || {},
ttl: 0,
};
}
const res2 = await Promise.all([
getDueTasks(deviceId, timestamp),
getFaults(deviceId),
getOperations(deviceId),
]);
return {
tasks: res2[0][0],
faults: res2[1],
operations: res2[2],
ttl: res2[0][1] || 0,
};
}
async function cacheDueTasksAndFaultsAndOperations(
deviceId,
tasks,
faults,
operations,
cacheUntil
): Promise<void> {
const v = {
tasks: null,
faults: null,
operations: null,
};
if (tasks.length) v.tasks = tasks;
if (Object.keys(faults).length) v.faults = faults;
if (Object.keys(operations).length) v.operations = operations;
let ttl;
if (cacheUntil) ttl = Math.trunc((Date.now() - cacheUntil) / 1000);
else ttl = config.get("MAX_CACHE_TTL", deviceId);
await cache.set(
`${deviceId}_tasks_faults_operations`,
JSON.stringify(v),
ttl
);
}
async function reportBadState(sessionContext: SessionContext): Promise<void> { async function reportBadState(sessionContext: SessionContext): Promise<void> {
logger.accessError({ logger.accessError({
message: "Bad session state", message: "Bad session state",
@@ -1640,19 +1561,14 @@ async function listenerAsync(
_sessionContext.httpResponse = httpResponse; _sessionContext.httpResponse = httpResponse;
_sessionContext.sessionId = crypto.randomBytes(8).toString("hex"); _sessionContext.sessionId = crypto.randomBytes(8).toString("hex");
const { const [dueTasks, faults, operations] = await Promise.all([
tasks: dueTasks, getDueTasks(deviceId, _sessionContext.timestamp),
faults, getFaults(deviceId),
operations, getOperations(deviceId),
ttl: cacheUntil, ]);
} = await getDueTasksAndFaultsAndOperations(
deviceId,
_sessionContext.timestamp
);
_sessionContext.tasks = dueTasks; _sessionContext.tasks = dueTasks[0];
_sessionContext.operations = operations; _sessionContext.operations = operations;
_sessionContext.cacheUntil = cacheUntil;
_sessionContext.faults = faults; _sessionContext.faults = faults;
_sessionContext.retries = {}; _sessionContext.retries = {};
for (const [k, v] of Object.entries(_sessionContext.faults)) { for (const [k, v] of Object.entries(_sessionContext.faults)) {
-5
View File
@@ -261,13 +261,11 @@ async function handler(
if (channel.startsWith("task_")) { if (channel.startsWith("task_")) {
const objId = new ObjectId(channel.slice(5)); const objId = new ObjectId(channel.slice(5));
await collections.tasks.deleteOne({ _id: objId }); await collections.tasks.deleteOne({ _id: objId });
await cache.del(`${deviceId}_tasks_faults_operations`);
response.writeHead(200); response.writeHead(200);
response.end(); response.end();
return; return;
} }
await cache.del(`${deviceId}_tasks_faults_operations`);
response.writeHead(200); response.writeHead(200);
response.end(); response.end();
} else { } else {
@@ -312,7 +310,6 @@ async function handler(
deviceId, deviceId,
30000 30000
); );
await cache.del(`${deviceId}_tasks_faults_operations`);
if (url.searchParams.has("connection_request")) { if (url.searchParams.has("connection_request")) {
if (socketTimeout) request.socket.setTimeout(socketTimeout); if (socketTimeout) request.socket.setTimeout(socketTimeout);
response.writeHead(202, { response.writeHead(202, {
@@ -456,7 +453,6 @@ async function handler(
_id: `${deviceId}:task_${taskId}`, _id: `${deviceId}:task_${taskId}`,
}); });
await cache.del(`${deviceId}_tasks_faults_operations`);
response.writeHead(200); response.writeHead(200);
response.end(); response.end();
} else { } else {
@@ -475,7 +471,6 @@ async function handler(
_id: `${deviceId}:task_${taskId}`, _id: `${deviceId}:task_${taskId}`,
}); });
await cache.del(`${deviceId}_tasks_faults_operations`);
response.writeHead(200); response.writeHead(200);
response.end(); response.end();
} else { } else {
-1
View File
@@ -160,7 +160,6 @@ export interface SessionContext {
authState: number; authState: number;
tasks?: Task[]; tasks?: Task[];
operations?: { [commandKey: string]: Operation }; operations?: { [commandKey: string]: Operation };
cacheUntil?: number;
syncState?: SyncState; syncState?: SyncState;
lastActivity?: number; lastActivity?: number;
extendLock?: number; extendLock?: number;