Adds lru cache for layergroups and named maps mapconfig provider

This commit is contained in:
Raul Ochoa
2015-07-15 16:51:26 +02:00
parent 5a5832394a
commit 909f8da2ff
6 changed files with 25 additions and 16 deletions
+7 -5
View File
@@ -1,20 +1,22 @@
var LruCache = require('lru-cache');
function LayergroupAffectedTables() {
// layergroupId -> affected tables cache
this.cache = {};
// dbname + layergroupId -> affected tables cache
this.cache = new LruCache({ max: 2000 });
}
module.exports = LayergroupAffectedTables;
LayergroupAffectedTables.prototype.hasAffectedTables = function(dbName, layergroupId) {
return this.cache.hasOwnProperty(createKey(dbName, layergroupId));
return this.cache.has(createKey(dbName, layergroupId));
};
LayergroupAffectedTables.prototype.set = function(dbName, layergroupId, affectedTables) {
this.cache[createKey(dbName, layergroupId)] = affectedTables;
this.cache.set(createKey(dbName, layergroupId), affectedTables);
};
LayergroupAffectedTables.prototype.get = function(dbName, layergroupId) {
return this.cache[createKey(dbName, layergroupId)];
return this.cache.get(createKey(dbName, layergroupId));
};
function createKey(dbName, layergroupId) {
+9 -8
View File
@@ -1,26 +1,26 @@
var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider');
var templateName = require('../backends/template_maps').templateName;
var LruCache = require("lru-cache");
function NamedMapProviderCache(templateMaps, pgConnection, userLimitsApi, queryTablesApi) {
this.templateMaps = templateMaps;
this.pgConnection = pgConnection;
this.userLimitsApi = userLimitsApi;
this.queryTablesApi = queryTablesApi;
this.providerCache = {};
this.providerCache = new LruCache({ max: 2000 });
}
module.exports = NamedMapProviderCache;
NamedMapProviderCache.prototype.get = function(user, templateId, config, authToken, params) {
var namedMapKey = createNamedMapKey(user, templateId);
if (!this.providerCache.hasOwnProperty(namedMapKey)) {
this.providerCache[namedMapKey] = {};
}
var namedMapProviders = this.providerCache.get(namedMapKey) || {};
var providerKey = createProviderKey(config, authToken);
if (!this.providerCache[namedMapKey].hasOwnProperty(providerKey)) {
this.providerCache[namedMapKey][providerKey] = new NamedMapMapConfigProvider(
if (!namedMapProviders.hasOwnProperty(providerKey)) {
namedMapProviders[providerKey] = new NamedMapMapConfigProvider(
this.templateMaps,
this.pgConnection,
this.userLimitsApi,
@@ -31,13 +31,14 @@ NamedMapProviderCache.prototype.get = function(user, templateId, config, authTok
authToken,
params
);
this.providerCache.set(namedMapKey, namedMapProviders);
}
return this.providerCache[namedMapKey][providerKey];
return namedMapProviders[providerKey];
};
NamedMapProviderCache.prototype.invalidate = function(user, templateId) {
delete this.providerCache[createNamedMapKey(user, templateId)];
this.providerCache.del(createNamedMapKey(user, templateId));
};
function createNamedMapKey(user, templateId) {
+5
View File
@@ -460,6 +460,11 @@
}
}
},
"lru-cache": {
"version": "2.6.5",
"from": "lru-cache@",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz"
},
"lzma": {
"version": "1.3.7",
"from": "lzma@~1.3.7",
+1
View File
@@ -33,6 +33,7 @@
"cartodb-psql": "~0.4.0",
"fastly-purge": "~1.0.0",
"redis-mpool": "~0.4.0",
"lru-cache": "2.6.5",
"lzma": "~1.3.7",
"log4js": "https://github.com/CartoDB/log4js-node/tarball/cdb"
},
+1 -1
View File
@@ -346,7 +346,7 @@ describe('tests from old api translated to multilayer', function() {
};
// reset internal cacheChannel cache
server.layergroupAffectedTablesCache.cache = {};
server.layergroupAffectedTablesCache.cache.reset();
assert.response(server,
{
+2 -2
View File
@@ -21,7 +21,7 @@ var server = new CartodbWindshaft(serverOptions);
server.setMaxListeners(0);
describe('template_api', function() {
server.layergroupAffectedTablesCache.cache = {};
server.layergroupAffectedTablesCache.cache.reset();
var redis_client = redis.createClient(global.environment.redis.port);
@@ -1225,7 +1225,7 @@ describe('template_api', function() {
assert.ok(cc);
assert.ok(cc.match, /ciao/, cc);
// hack simulating restart...
server.layergroupAffectedTablesCache.cache = {}; // need to clean channel cache
server.layergroupAffectedTablesCache.cache.reset(); // need to clean channel cache
var get_request = {
url: '/api/v1/map/' + layergroupid + ':cb1/0/0/0/1.json.torque?auth_token=valid1',
method: 'GET',