From 25931a618b1de559610b0fb1eb32bbb87d305dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 12 Mar 2018 12:33:29 +0100 Subject: [PATCH 1/4] Do not calculate affected tables when there are no affacted tables --- lib/cartodb/controllers/layergroup.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 182fcff5..e10a59c5 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -516,22 +516,28 @@ function getAffectedTables (layergroupAffectedTables, pgConnection) { return next(); } + const sql = []; + mapconfig.getLayers().forEach(function(layer) { + sql.push(layer.options.sql); + if (layer.options.affected_tables) { + layer.options.affected_tables.map(function(table) { + sql.push(`SELECT * FROM ${table} LIMIT 0`); + }); + } + }); + + const sql = queries.length ? queries.join(';') : null; + + if (!sql) { + return next(); + } + pgConnection.getConnection(user, (err, connection) => { if (err) { global.logger.warn('ERROR generating cache channel:', err); return next(); } - const sql = []; - mapconfig.getLayers().forEach(function(layer) { - sql.push(layer.options.sql); - if (layer.options.affected_tables) { - layer.options.affected_tables.map(function(table) { - sql.push(`SELECT * FROM ${table} LIMIT 0`); - }); - } - }); - QueryTables.getAffectedTablesFromQuery(connection, sql.join(';'), (err, affectedTables) => { req.profiler.done('getAffectedTablesFromQuery'); if (err) { From cc76ccc62643d9d9ae6778849ae5b223fde2a4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 12 Mar 2018 13:10:20 +0100 Subject: [PATCH 2/4] Fix undeclared variable --- lib/cartodb/controllers/layergroup.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index e10a59c5..9ff10827 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -516,12 +516,12 @@ function getAffectedTables (layergroupAffectedTables, pgConnection) { return next(); } - const sql = []; + const queries = []; mapconfig.getLayers().forEach(function(layer) { - sql.push(layer.options.sql); + queries.push(layer.options.sql); if (layer.options.affected_tables) { layer.options.affected_tables.map(function(table) { - sql.push(`SELECT * FROM ${table} LIMIT 0`); + queries.push(`SELECT * FROM ${table} LIMIT 0`); }); } }); @@ -529,6 +529,7 @@ function getAffectedTables (layergroupAffectedTables, pgConnection) { const sql = queries.length ? queries.join(';') : null; if (!sql) { + global.logger.warn('ERROR generating cache channel: this request doesn\'t need an X-Cache-Channel generated'); return next(); } @@ -538,7 +539,7 @@ function getAffectedTables (layergroupAffectedTables, pgConnection) { return next(); } - QueryTables.getAffectedTablesFromQuery(connection, sql.join(';'), (err, affectedTables) => { + QueryTables.getAffectedTablesFromQuery(connection, sql, (err, affectedTables) => { req.profiler.done('getAffectedTablesFromQuery'); if (err) { global.logger.warn('ERROR generating cache channel: ', err); From 379b649e9520208056b8216f20b7da7e9ee93994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 12 Mar 2018 13:29:40 +0100 Subject: [PATCH 3/4] Don't get mapconfig prematurely --- lib/cartodb/controllers/layergroup.js | 94 +++++++++++++-------------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 9ff10827..20408b07 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -59,7 +59,7 @@ LayergroupController.prototype.register = function(app) { getTile(this.tileBackend, 'map_tile'), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), incrementSuccessMetrics(global.statsClient), @@ -78,7 +78,7 @@ LayergroupController.prototype.register = function(app) { getTile(this.tileBackend, 'map_tile'), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), incrementSuccessMetrics(global.statsClient), @@ -98,7 +98,7 @@ LayergroupController.prototype.register = function(app) { getTile(this.tileBackend, 'maplayer_tile'), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), incrementSuccessMetrics(global.statsClient), @@ -117,7 +117,7 @@ LayergroupController.prototype.register = function(app) { getFeatureAttributes(this.attributesBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -135,7 +135,7 @@ LayergroupController.prototype.register = function(app) { getPreviewImageByCenter(this.previewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -151,7 +151,7 @@ LayergroupController.prototype.register = function(app) { getPreviewImageByBoundingBox(this.previewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -185,7 +185,7 @@ LayergroupController.prototype.register = function(app) { getDataview(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -201,7 +201,7 @@ LayergroupController.prototype.register = function(app) { getDataview(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -217,7 +217,7 @@ LayergroupController.prototype.register = function(app) { dataviewSearch(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -233,7 +233,7 @@ LayergroupController.prototype.register = function(app) { dataviewSearch(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -301,18 +301,9 @@ function createMapStoreMapConfigProvider (mapStore, userLimitsApi, forcedFormat params.layer = params.layer || 'all'; } - const mapConfigProvider = new MapStoreMapConfigProvider(mapStore, user, userLimitsApi, params); + res.locals.mapConfigProvider = new MapStoreMapConfigProvider(mapStore, user, userLimitsApi, params); - mapConfigProvider.getMapConfig((err, mapconfig) => { - if (err) { - return next(err); - } - - res.locals.mapConfigProvider = mapConfigProvider; - res.locals.mapconfig = mapconfig; - - next(); - }); + next(); }; } @@ -507,51 +498,58 @@ function setCacheControlHeader () { }; } -function getAffectedTables (layergroupAffectedTables, pgConnection) { +function getAffectedTables (layergroupAffectedTables, pgConnection, mapStore) { return function getAffectedTablesMiddleware (req, res, next) { - const { user, dbname, token, mapconfig } = res.locals; + const { user, dbname, token } = res.locals; if (layergroupAffectedTables.hasAffectedTables(dbname, token)) { res.locals.affectedTables = layergroupAffectedTables.get(dbname, token); return next(); } - const queries = []; - mapconfig.getLayers().forEach(function(layer) { - queries.push(layer.options.sql); - if (layer.options.affected_tables) { - layer.options.affected_tables.map(function(table) { - queries.push(`SELECT * FROM ${table} LIMIT 0`); - }); - } - }); - - const sql = queries.length ? queries.join(';') : null; - - if (!sql) { - global.logger.warn('ERROR generating cache channel: this request doesn\'t need an X-Cache-Channel generated'); - return next(); - } - - pgConnection.getConnection(user, (err, connection) => { + mapStore.load(token, (err, mapconfig) => { if (err) { global.logger.warn('ERROR generating cache channel:', err); return next(); } - QueryTables.getAffectedTablesFromQuery(connection, sql, (err, affectedTables) => { - req.profiler.done('getAffectedTablesFromQuery'); + const queries = []; + mapconfig.getLayers().forEach(function(layer) { + queries.push(layer.options.sql); + if (layer.options.affected_tables) { + layer.options.affected_tables.map(function(table) { + queries.push(`SELECT * FROM ${table} LIMIT 0`); + }); + } + }); + + const sql = queries.length ? queries.join(';') : null; + + if (!sql) { + global.logger.warn('ERROR generating cache channel: this request doesn\'t need an X-Cache-Channel generated'); + return next(); + } + + pgConnection.getConnection(user, (err, connection) => { if (err) { - global.logger.warn('ERROR generating cache channel: ', err); + global.logger.warn('ERROR generating cache channel:', err); return next(); } - // feed affected tables cache so it can be reused from, for instance, map controller - layergroupAffectedTables.set(dbname, token, affectedTables); + QueryTables.getAffectedTablesFromQuery(connection, sql, (err, affectedTables) => { + req.profiler.done('getAffectedTablesFromQuery'); + if (err) { + global.logger.warn('ERROR generating cache channel: ', err); + return next(); + } - res.locals.affectedTables = affectedTables; + // feed affected tables cache so it can be reused from, for instance, map controller + layergroupAffectedTables.set(dbname, token, affectedTables); - next(); + res.locals.affectedTables = affectedTables; + + next(); + }); }); }); }; From db8130be4ff97880756c18f20dd5adc072e1faac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 12 Mar 2018 14:18:07 +0100 Subject: [PATCH 4/4] Honor jshint --- lib/cartodb/controllers/layergroup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 20408b07..2d0bf710 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -526,7 +526,8 @@ function getAffectedTables (layergroupAffectedTables, pgConnection, mapStore) { const sql = queries.length ? queries.join(';') : null; if (!sql) { - global.logger.warn('ERROR generating cache channel: this request doesn\'t need an X-Cache-Channel generated'); + global.logger.warn('ERROR generating cache channel:' + + ' this request doesn\'t need an X-Cache-Channel generated'); return next(); }