From 909f8da2ff4ccbd42bffd7f72e11a95179d9f94e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 15 Jul 2015 16:51:26 +0200 Subject: [PATCH] Adds lru cache for layergroups and named maps mapconfig provider --- lib/cartodb/cache/layergroup_affected_tables.js | 12 +++++++----- lib/cartodb/cache/named_map_provider_cache.js | 17 +++++++++-------- npm-shrinkwrap.json | 5 +++++ package.json | 1 + test/acceptance/multilayer_server.js | 2 +- test/acceptance/templates.js | 4 ++-- 6 files changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/cartodb/cache/layergroup_affected_tables.js b/lib/cartodb/cache/layergroup_affected_tables.js index c2cccc71..d33c5a73 100644 --- a/lib/cartodb/cache/layergroup_affected_tables.js +++ b/lib/cartodb/cache/layergroup_affected_tables.js @@ -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) { diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index c77d3f7b..49dc6e49 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -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) { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 19a0d623..dba561e5 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -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", diff --git a/package.json b/package.json index d10c62dd..847b8341 100644 --- a/package.json +++ b/package.json @@ -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" }, diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index 463d41d6..b8b5db2a 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -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, { diff --git a/test/acceptance/templates.js b/test/acceptance/templates.js index 925a6974..c1fa248b 100644 --- a/test/acceptance/templates.js +++ b/test/acceptance/templates.js @@ -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',