Speed up GetNodeRights() using 10 second caching.
Ylian Saint-Hilaire committed
Jan 9, 2022 at 13:19 UTC
42a0ff960bd20b8f83f012bf8edf9fa850dac7b7
1 file changed
+28
-3
webserver.js
+28
-3
@@ -7249,17 +7249,39 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
7249
return false;
7250
}
7251
7252
+ var GetNodeRightsCache = {};
7253
+ var GetNodeRightsCacheCount = 0;
7254
+
7255
// Return the user rights for a given node
7256
obj.GetNodeRights = function (user, mesh, nodeid) {
7257
if ((user == null) || (mesh == null) || (nodeid == null)) { return 0; }
7258
if (typeof user == 'string') { user = obj.users[user]; }
7259
if (user == null) { return 0; }
7260
+ var meshid;
7261
+ if (typeof mesh == 'string') { meshid = mesh; } else if ((typeof mesh == 'object') && (typeof mesh._id == 'string')) { meshid = mesh._id; } else return 0;
7262
+
7263
+ // Check if we have this in the cache
7264
+ const cacheid = user._id + '/' + meshid + '/' + nodeid;
7265
+ const cache = GetNodeRightsCache[cacheid];
7266
+ if (cache != null) { if (cache.t > Date.now()) { return cache.o; } else { GetNodeRightsCacheCount--; } } // Cache hit, or we need to update the cache
7267
+ if (GetNodeRightsCacheCount > 2000) { GetNodeRightsCache = {}; GetNodeRightsCacheCount = 0; } // From time to time, flush the cache
7268
+
7269
var r = obj.GetMeshRights(user, mesh);
7258
- if (r == 0xFFFFFFFF) return removeUserRights(r, user);
7270
+ if (r == 0xFFFFFFFF) {
7271
+ const out = removeUserRights(r, user);
7272
+ GetNodeRightsCache[cacheid] = { t: Date.now() + 10000, o: out };
7273
+ GetNodeRightsCacheCount++;
7274
+ return out;
7275
+ }
7276
7277
// Check direct device rights using device data
7278
if ((user.links != null) && (user.links[nodeid] != null)) { r |= user.links[nodeid].rights; } // TODO: Deal with reverse permissions
7262
- if (r == 0xFFFFFFFF) return removeUserRights(r, user);
7279
+ if (r == 0xFFFFFFFF) {
7280
+ const out = removeUserRights(r, user);
7281
+ GetNodeRightsCache[cacheid] = { t: Date.now() + 10000, o: out };
7282
+ GetNodeRightsCacheCount++;
7283
+ return out;
7284
+ }
7285
7286
// Check direct device rights thru a user group
7287
for (var i in user.links) {
@@ -7269,7 +7291,10 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
7291
}
7292
}
7293
7272
- return removeUserRights(r, user);
7294
+ const out = removeUserRights(r, user);
7295
+ GetNodeRightsCache[cacheid] = { t: Date.now() + 10000, o: out };
7296
+ GetNodeRightsCacheCount++;
7297
+ return out;
7298
}
7299
7300
// Returns a list of displatch targets for a given mesh