From 290e005e141fbb96d6b4f64cd73d7780bb9176a2 Mon Sep 17 00:00:00 2001 From: Luis Bosque Date: Thu, 20 Dec 2012 12:28:43 +0100 Subject: [PATCH 01/46] Target v1.1.5 --- NEWS.md | 3 +++ package.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 9d5e76fa..9c7dbc3c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +1.1.6 +----- + 1.1.5 (DD//MM//YY) ----- * Fix bogus cached return of utf grid for fully contained tiles (#67) diff --git a/package.json b/package.json index 85e3afe1..8ac63341 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "1.1.5", + "version": "1.1.6", "description": "A map tile server for CartoDB", "url": "https://github.com/Vizzuality/Windshaft-cartodb", "licenses": [{ From ab1a0e03393c20f4a739c54be272f27799f7e281 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 20 Dec 2012 13:08:56 +0100 Subject: [PATCH 02/46] Add check-full to run testsuite of submodules This model should be improved to avoid double-checking when the same submodule could be installed or referenced by multiple levels... --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8048c6c1..64b66438 100644 --- a/Makefile +++ b/Makefile @@ -7,5 +7,14 @@ clean: config/environments/test.js: config/environments/test.js.example ./configure -check: config/environments/test.js +check-local: config/environments/test.js ./run_tests.sh + +check-submodules: + for sub in windshaft grainstore mapnik; do \ + test -e node_modules/$${sub} && make -C node_modules/$${sub} check; \ + done + +check-full: check-local check-submodules + +check: check-local From 0ff403fa83aef6bf57480a20f80f6a9995df8fa5 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 21 Dec 2012 13:24:38 +0100 Subject: [PATCH 03/46] Require grainstore 0.10.9, fixing an issue with multi-geom markers --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 8c631486..0a1f5972 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -187,7 +187,7 @@ "version": "1.3.3" }, "grainstore": { - "version": "0.10.8", + "version": "0.10.9", "dependencies": { "carto": { "version": "0.9.3-cdb2", diff --git a/package.json b/package.json index 8ac63341..11d646b3 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "cluster2": "git://github.com/CartoDB/cluster2.git#cdb_production", "node-varnish": "0.1.1", "underscore" : "~1.3.3", - "grainstore" : "~0.10.8", + "grainstore" : "~0.10.9", "windshaft" : "~0.8.2", "step": "0.0.x", "generic-pool": "1.0.x", From 093d3de66ec8fa7b59341743c736eb08c03c7247 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 21 Dec 2012 17:32:00 +0100 Subject: [PATCH 04/46] We don't run tests with expresso anymore... --- test/support/prepare_db.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/support/prepare_db.sh b/test/support/prepare_db.sh index c5a39d7e..567b4d1e 100755 --- a/test/support/prepare_db.sh +++ b/test/support/prepare_db.sh @@ -33,4 +33,5 @@ echo "SADD rails:users:localhost:map_key 1235" | redis-cli -p ${REDIS_PORT} -n 5 echo 'HSET rails:'"${TEST_DB}"':my_table infowindow "this, that, the other"' | redis-cli -p ${REDIS_PORT} -n 0 echo 'HSET rails:'"${TEST_DB}"':test_table_private_1 privacy "0"' | redis-cli -p ${REDIS_PORT} -n 0 -echo "Finished preparing data. Run tests with expresso." +echo "Finished preparing data. Ready to run tests" + From b130b67f248224c42800dc1289153a4ccd2985d9 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 28 Jan 2013 17:12:21 +0100 Subject: [PATCH 05/46] Check redis connection at pool creation time --- lib/cartodb/redis_pool.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/redis_pool.js b/lib/cartodb/redis_pool.js index ea5c1bd5..d2c40cc2 100644 --- a/lib/cartodb/redis_pool.js +++ b/lib/cartodb/redis_pool.js @@ -58,8 +58,11 @@ var RedisPool = function(opts){ client.send_anyway = true; client.select(database); client.send_anyway = false; + callback(null, client); }); - return callback(null, client); + client.on('error', function (err) { + callback(err, null); + }); }, destroy: function(client) { return client.quit(); From ac49abe7504bbaf197e18b1f3be29e583e649882 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 28 Jan 2013 17:13:49 +0100 Subject: [PATCH 06/46] Do not leak redis client connections on redis command error --- lib/cartodb/carto_data.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/cartodb/carto_data.js b/lib/cartodb/carto_data.js index 5ad4723c..83b9933b 100644 --- a/lib/cartodb/carto_data.js +++ b/lib/cartodb/carto_data.js @@ -232,8 +232,7 @@ module.exports = function() { redisClient[redisFunc.toUpperCase()].apply(redisClient, redisArgs); }, function releaseRedisClient(err, data) { - if (err) throw err; - redis_pool.release(db, redisClient); + if ( ! _.isUndefined(redisClient) ) redis_pool.release(db, redisClient); callback(err, data); } ); From dd19d741497adf65dabe719ae9f2545db456044b Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 28 Jan 2013 17:30:58 +0100 Subject: [PATCH 07/46] getDatabase: properly handle redis connection failures --- lib/cartodb/carto_data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/carto_data.js b/lib/cartodb/carto_data.js index 83b9933b..9c7a8d0f 100644 --- a/lib/cartodb/carto_data.js +++ b/lib/cartodb/carto_data.js @@ -35,7 +35,7 @@ module.exports = function() { var redisKey = _.template(this.user_key, {username: username}); this.retrieve(this.user_metadata_db, redisKey, 'database_name', function(err, dbname) { - if ( err ) callback(err, null); + if ( err ) { callback(err, null); return; } else if ( dbname === null ) { callback(new Error("missing " + username + "'s dbname in redis (try CARTODB/script/restore_redis)"), null); } From 8d4f033a562bd08da4486d2b1192c56e84e5b7c4 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 28 Jan 2013 17:39:50 +0100 Subject: [PATCH 08/46] Revert "getDatabase: properly handle redis connection failures" This reverts commit dd19d741497adf65dabe719ae9f2545db456044b. The code was already correct --- lib/cartodb/carto_data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/carto_data.js b/lib/cartodb/carto_data.js index 9c7a8d0f..83b9933b 100644 --- a/lib/cartodb/carto_data.js +++ b/lib/cartodb/carto_data.js @@ -35,7 +35,7 @@ module.exports = function() { var redisKey = _.template(this.user_key, {username: username}); this.retrieve(this.user_metadata_db, redisKey, 'database_name', function(err, dbname) { - if ( err ) { callback(err, null); return; } + if ( err ) callback(err, null); else if ( dbname === null ) { callback(new Error("missing " + username + "'s dbname in redis (try CARTODB/script/restore_redis)"), null); } From 42b3d0ab9c059907c92eea0d08011d5ad9d03bb4 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 29 Jan 2013 13:01:17 +0100 Subject: [PATCH 09/46] Add redis timeout and reap interval options in production.js.example Use default values, for documentation purposes --- config/environments/development.js.example | 4 ++-- config/environments/production.js.example | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/config/environments/development.js.example b/config/environments/development.js.example index 050cfc45..8d5bb5a9 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -32,8 +32,8 @@ var config = { ,redis: { host: '127.0.0.1', port: 6379, - idleTimeoutMillis: 1, - reapIntervalMillis: 1 + idleTimeoutMillis: 1, // idle time before dropping connection + reapIntervalMillis: 1 // time between cleanups } ,sqlapi: { protocol: 'http', diff --git a/config/environments/production.js.example b/config/environments/production.js.example index e7a76715..fb9ef4b3 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -25,7 +25,9 @@ var config = { } ,redis: { host: '127.0.0.1', - port: 6379 + port: 6379, + idleTimeoutMillis: 30000, // idle time before dropping connection + reapIntervalMillis: 1000 // time between cleanups } ,sqlapi: { protocol: 'https', From 8d5baebf1d94c910f6d18c2daf022ace49e3a99d Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 29 Jan 2013 13:13:14 +0100 Subject: [PATCH 10/46] Require latest grainstore and windshaft stable releases Fixes some http response status to be 400 rather than 500 --- npm-shrinkwrap.json | 4 ++-- package.json | 4 ++-- test/acceptance/server.js | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0a1f5972..9a832d3c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -187,7 +187,7 @@ "version": "1.3.3" }, "grainstore": { - "version": "0.10.9", + "version": "0.10.10", "dependencies": { "carto": { "version": "0.9.3-cdb2", @@ -254,7 +254,7 @@ } }, "windshaft": { - "version": "0.8.2", + "version": "0.8.3", "dependencies": { "express": { "version": "2.5.11", diff --git a/package.json b/package.json index 11d646b3..7eadf430 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ "cluster2": "git://github.com/CartoDB/cluster2.git#cdb_production", "node-varnish": "0.1.1", "underscore" : "~1.3.3", - "grainstore" : "~0.10.9", - "windshaft" : "~0.8.2", + "grainstore" : "~0.10.10", + "windshaft" : "~0.8.3", "step": "0.0.x", "generic-pool": "1.0.x", "redis": "0.7.2", diff --git a/test/acceptance/server.js b/test/acceptance/server.js index 7f5ccf03..3e419015 100644 --- a/test/acceptance/server.js +++ b/test/acceptance/server.js @@ -110,7 +110,7 @@ suite('server', function() { },{ }, function(res) { // FIXME: should be 401 Unauthorized - assert.equal(res.statusCode, 500, res.body); + assert.equal(res.statusCode, 400, res.body); assert.deepEqual(JSON.parse(res.body), {error: 'Sorry, you are unauthorized (permission denied)'}); done(); @@ -127,7 +127,7 @@ suite('server', function() { },{ }, function(res) { // FIXME: should be 401 Unauthorized - assert.equal(res.statusCode, 500, res.body); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); assert.deepEqual(JSON.parse(res.body), {error:"missing unknown_user's dbname in redis (try CARTODB/script/restore_redis)"}); done(); @@ -175,7 +175,7 @@ suite('server', function() { headers: {host: 'localhost', 'Content-Type': 'application/x-www-form-urlencoded' }, data: querystring.stringify({style: '#my_table3{backgxxxxxround-color:#fff;}'}) },{ - status: 500, // FIXME: should be 400 ! + status: 400, body: /Unrecognized rule: backgxxxxxround-color/ }, function() { done(); }); }); @@ -187,7 +187,7 @@ suite('server', function() { headers: {host: 'localhost', 'Content-Type': 'application/x-www-form-urlencoded' }, data: querystring.stringify({style: '#my_table3{'}) },{ - status: 500, // FIXME: should be 400 ! + status: 400, body: /Missing closing/ }, function() { done(); }); }); @@ -199,7 +199,7 @@ suite('server', function() { headers: {host: 'localhost', 'Content-Type': 'application/x-www-form-urlencoded' }, data: querystring.stringify({style: '#my_table4{backgxxxxxround-color:#fff;foo:bar}'}) },{ - status: 500, // FIXME: should be 400 ! + status: 400, }, function(res) { var parsed = JSON.parse(res.body); assert.equal(parsed.length, 2); @@ -252,7 +252,7 @@ suite('server', function() { data: querystring.stringify({style: 'Map { background-color:#aaa; }'}) },{}, function(res) { // FIXME: should be 401 Unauthorized - assert.equal(res.statusCode, 500, res.body); + assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body); assert.ok(res.body.indexOf('map state cannot be changed by unauthenticated request') != -1, res.body); assert.response(server, { @@ -464,7 +464,7 @@ suite('server', function() { method: 'GET' },{}, function(res) { // FIXME: should be 401 Unauthorized - assert.equal(res.statusCode, 500, res.body); + assert.equal(res.statusCode, 500, res.statusCode + ': ' + res.body); done(); }); }); @@ -479,7 +479,7 @@ suite('server', function() { },{ }, function(res) { // FIXME: should be 401 Unauthorized - assert.equal(res.statusCode, 500, res.body); + assert.equal(res.statusCode, 500, res.statusCode + ': ' + res.body); assert.deepEqual(JSON.parse(res.body), {error:"missing unknown_user's dbname in redis (try CARTODB/script/restore_redis)"}); done(); From 2510a47262cdfaebf00eedb9d2b21437b29888a9 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 29 Jan 2013 17:36:50 +0100 Subject: [PATCH 11/46] Add maxConnection environment configuration, have it default to 128 The number gives the maximum number of contemporary connections and is dimensioned on the limit of open file descriptors found to be needed on a per-connection basis. --- app.js | 8 ++++++++ cluster.js | 3 +++ config/environments/development.js.example | 3 +++ config/environments/production.js.example | 3 +++ config/environments/staging.js.example | 3 +++ config/environments/test.js.example | 3 +++ 6 files changed, 23 insertions(+) diff --git a/app.js b/app.js index f432a617..aee614d2 100755 --- a/app.js +++ b/app.js @@ -33,7 +33,15 @@ var Windshaft = require('windshaft'); var serverOptions = require('./lib/cartodb/server_options'); ws = CartodbWindshaft(serverOptions); + +// Maximum number of connections for one process +// 128 is a good number if you have up to 1024 filedescriptors +// 4 is good if you have max 32 filedescriptors +// 1 is good if you have max 16 filedescriptors +ws.maxConnections = global.environment.maxConnections || 128; + ws.listen(global.environment.port, global.environment.host); + ws.on('listening', function() { console.log("Windshaft tileserver started on " + global.environment.host + ':' + global.environment.port); }); diff --git a/cluster.js b/cluster.js index d5501d17..74f7361a 100755 --- a/cluster.js +++ b/cluster.js @@ -36,6 +36,9 @@ var serverOptions = require('./lib/cartodb/server_options'); var ws = CartodbWindshaft(serverOptions); +// Maximum number of connections for one process (see apps.js) +ws.maxConnections = global.environment.maxConnections || 128; + //.use(cluster.logger('logs')) //.use(cluster.stats()) //.use(cluster.pidfiles('pids')) diff --git a/config/environments/development.js.example b/config/environments/development.js.example index 8d5bb5a9..27509b2a 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -2,6 +2,9 @@ var config = { environment: 'development' ,port: 8181 ,host: '127.0.0.1' + // Maximum number of connections for one process + // 128 is a good value with a limit of 1024 open file descriptors + ,maxConnections:128 // idle socket timeout, in miliseconds ,socket_timeout: 600000 ,enable_cors: true diff --git a/config/environments/production.js.example b/config/environments/production.js.example index fb9ef4b3..5d73f79e 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -2,6 +2,9 @@ var config = { environment: 'production' ,port: 8181 ,host: '127.0.0.1' + // Maximum number of connections for one process + // 128 is a good value with a limit of 1024 open file descriptors + ,maxConnections:128 // idle socket timeout, in miliseconds ,socket_timeout: 600000 ,enable_cors: true diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index dedb5001..366401e2 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -2,6 +2,9 @@ var config = { environment: 'production' ,port: 8181 ,host: '127.0.0.1' + // Maximum number of connections for one process + // 128 is a good value with a limit of 1024 open file descriptors + ,maxConnections:128 // idle socket timeout, in miliseconds ,socket_timeout: 600000 ,enable_cors: true diff --git a/config/environments/test.js.example b/config/environments/test.js.example index 096acb03..a9db586f 100644 --- a/config/environments/test.js.example +++ b/config/environments/test.js.example @@ -2,6 +2,9 @@ var config = { environment: 'test' ,port: 8888 ,host: '127.0.0.1' + // Maximum number of connections for one process + // 128 is a good value with a limit of 1024 open file descriptors + ,maxConnections:128 // idle socket timeout, in miliseconds ,socket_timeout: 600000 ,enable_cors: true From e408d04fc55c657cde0df1b88000998a06e13843 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Wed, 30 Jan 2013 11:29:44 +0100 Subject: [PATCH 12/46] Require Windshaft 0.8.4 to add dump of cache stats on SIGUSR1 --- app.js | 4 ++++ cluster.js | 3 +++ npm-shrinkwrap.json | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index aee614d2..225f8e64 100755 --- a/app.js +++ b/app.js @@ -45,3 +45,7 @@ ws.listen(global.environment.port, global.environment.host); ws.on('listening', function() { console.log("Windshaft tileserver started on " + global.environment.host + ':' + global.environment.port); }); + +process.on('SIGUSR1', function() { + ws.dumpCacheStats(); +}); diff --git a/cluster.js b/cluster.js index 74f7361a..24866a06 100755 --- a/cluster.js +++ b/cluster.js @@ -57,3 +57,6 @@ cluster.listen(function(cb) { console.log("Windshaft tileserver started on port " + global.environment.port); }); +process.on('SIGUSR1', function() { + ws.dumpCacheStats(); +}); diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 9a832d3c..733a29dc 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -254,7 +254,7 @@ } }, "windshaft": { - "version": "0.8.3", + "version": "0.8.4", "dependencies": { "express": { "version": "2.5.11", diff --git a/package.json b/package.json index 7eadf430..8b5c2b85 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "node-varnish": "0.1.1", "underscore" : "~1.3.3", "grainstore" : "~0.10.10", - "windshaft" : "~0.8.3", + "windshaft" : "~0.8.4", "step": "0.0.x", "generic-pool": "1.0.x", "redis": "0.7.2", From 61f4212ba2f4bcaef70b64c23d32ee11a42d694d Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Wed, 30 Jan 2013 12:59:05 +0100 Subject: [PATCH 13/46] Remove use of ANSI colors from all example log formats --- config/environments/development.js.example | 2 +- config/environments/production.js.example | 2 +- config/environments/staging.js.example | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/environments/development.js.example b/config/environments/development.js.example index 27509b2a..2f65ab4d 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -9,7 +9,7 @@ var config = { ,socket_timeout: 600000 ,enable_cors: true ,cache_enabled: false - ,log_format: '[:date] :req[X-Real-IP] \033[90m:method\033[0m \033[36m:req[Host]:url\033[0m \033[90m:status :response-time ms -> :res[Content-Type]\033[0m' + ,log_format: '[:date] :req[X-Real-IP] :method :req[Host]:url :status :response-time ms -> :res[Content-Type]' ,postgres_auth_user: 'development_cartodb_user_<%= user_id %>' ,postgres: { // Parameters to pass to datasource plugin of mapnik diff --git a/config/environments/production.js.example b/config/environments/production.js.example index 5d73f79e..9a336133 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -9,7 +9,7 @@ var config = { ,socket_timeout: 600000 ,enable_cors: true ,cache_enabled: true - ,log_format: '[:date] :req[X-Real-IP] \033[90m:method\033[0m \033[36m:req[Host]:url\033[0m \033[90m:status :response-time ms -> :res[Content-Type]\033[0m' + ,log_format: '[:date] :req[X-Real-IP] :method :req[Host]:url :status :response-time ms -> :res[Content-Type]' ,postgres_auth_user: 'cartodb_user_<%= user_id %>' ,postgres: { // Parameters to pass to datasource plugin of mapnik diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index 366401e2..c691468f 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -9,7 +9,7 @@ var config = { ,socket_timeout: 600000 ,enable_cors: true ,cache_enabled: true - ,log_format: '[:date] :req[X-Real-IP] \033[90m:method\033[0m \033[36m:req[Host]:url\033[0m \033[90m:status :response-time ms -> :res[Content-Type]\033[0m' + ,log_format: '[:date] :req[X-Real-IP] :method :req[Host]:url :status :response-time ms -> :res[Content-Type]' ,postgres_auth_user: 'cartodb_staging_user_<%= user_id %>' ,postgres: { // Parameters to pass to datasource plugin of mapnik From 6c40d936efa033951195755737a0572fe140c966 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 1 Feb 2013 11:28:08 +0100 Subject: [PATCH 14/46] Add a log on cluster startup, including date and pid --- cluster.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cluster.js b/cluster.js index 24866a06..84ac8040 100755 --- a/cluster.js +++ b/cluster.js @@ -51,6 +51,8 @@ var cluster = new Cluster({ noWorkers: 1 }); +console.log(new Date().toISOString() + " - " + process.pid + " - Windshaft cluster starting"); + cluster.listen(function(cb) { cb(ws); }, function() { From 2d35a2c269b07fabfb21a2196ef7983a89fc2625 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 7 Feb 2013 12:32:06 +0100 Subject: [PATCH 15/46] Add checkfds utility script --- tools/checkfds.sh | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 tools/checkfds.sh diff --git a/tools/checkfds.sh b/tools/checkfds.sh new file mode 100755 index 00000000..f6df2126 --- /dev/null +++ b/tools/checkfds.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +# Sorry, you must currently manually edit the regexp to make this work +# on your machine. + +master_pid=$(ps xa | grep windshaft | grep -v local | grep -v grep | awk '{print $1}') + +# TODO: use pid files +worker_pids=$(ps xa | grep windshaft | grep local | awk '{print $1}' | + python -c "import sys; print ','.join((x.strip() for x in sys.stdin.readlines()))") + +if test -z "${worker_pids}"; then + echo "No workers found" + exit 1 +fi + +echo "Master: $master_pid" +echo "Workers: $worker_pids" + +# TODO: use lsof only once, then grep in the report +for pid in $(echo $worker_pids | tr ',' ' '); do + echo -n "worker $pid postgres: " + lsof -p $pid | grep ':6432 .EST' | wc -l; + + echo -n "worker $pid redis: " + lsof -p $pid | grep ':6379 .EST' | wc -l; + + echo -n "worker $pid incoming http: " + lsof -p $pid | grep ':8181' | wc -l; + + echo -n "worker $pid total: " + lsof -p $pid | wc -l; +done + + +echo -n "master $master_pid total: " +lsof -p $master_pid | grep node | wc -l; From 0b56dd09d9ba0e8fbcebfdf5780832d24bf65468 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 7 Feb 2013 13:26:11 +0100 Subject: [PATCH 16/46] checkfds: use lsof only once, then grep in the report --- tools/checkfds.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index f6df2126..1bc53a65 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -17,19 +17,24 @@ fi echo "Master: $master_pid" echo "Workers: $worker_pids" -# TODO: use lsof only once, then grep in the report for pid in $(echo $worker_pids | tr ',' ' '); do + + pidrep="/tmp/checkfd.$pid.txt" + + lsof -p $pid > "${pidrep}" + echo -n "worker $pid postgres: " - lsof -p $pid | grep ':6432 .EST' | wc -l; + cat "${pidrep}" | grep ':6432 .EST' | wc -l; echo -n "worker $pid redis: " - lsof -p $pid | grep ':6379 .EST' | wc -l; + cat "${pidrep}" | grep ':6379 .EST' | wc -l; echo -n "worker $pid incoming http: " - lsof -p $pid | grep ':8181' | wc -l; + cat "${pidrep}" | grep ':8181' | wc -l; echo -n "worker $pid total: " - lsof -p $pid | wc -l; + cat "${pidrep}" | wc -l; + done From cb57dfb27d58a79d5dd8a211c16f7e708542bd49 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 12:14:53 +0100 Subject: [PATCH 17/46] Fix async throws in getGeometryType, getInfoWindow and getMapMetadata --- lib/cartodb/carto_data.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/cartodb/carto_data.js b/lib/cartodb/carto_data.js index 83b9933b..9c9b03f4 100644 --- a/lib/cartodb/carto_data.js +++ b/lib/cartodb/carto_data.js @@ -126,7 +126,6 @@ module.exports = function() { that.retrieve(that.table_metadata_db, redisKey, 'privacy', this); }, function(err, data){ - //if (err) throw err; callback(err, data); } ); @@ -152,7 +151,6 @@ module.exports = function() { that.retrieve(that.table_metadata_db, redisKey, 'the_geom_type', this); }, function(err, data){ - if (err) throw err; callback(err, data); } ); @@ -172,7 +170,6 @@ module.exports = function() { that.retrieve(that.table_metadata_db, redisKey, 'infowindow', this); }, function(err, data){ - if (err) throw err; callback(err, data); } ); @@ -193,7 +190,6 @@ module.exports = function() { that.retrieve(that.table_metadata_db, redisKey, 'map_metadata', this); }, function(err, data){ - if (err) throw err; callback(err, data); } ); From 7d34cbbd63841395060f355c7502fc2f690af3a7 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 12:23:25 +0100 Subject: [PATCH 18/46] Add item about async throws --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 2c196a0d..a9e5cc78 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ ----- * Require grainstore 0.10.9, fixing an issue with multi-geom markers * Enhance run_tests.sh to allow running single tests and skipping preparation +* Fix async throws in getGeometryType, getInfoWindow and getMapMetadata 1.1.5 (DD//MM//YY) ----- From 6b71cde56eb6e5feaa822bc5dabfb603100cdf47 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 12:27:49 +0100 Subject: [PATCH 19/46] Do not throw an Error embedding another Error Should fix #68, but doesn't come with an automated test --- lib/cartodb/carto_data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/carto_data.js b/lib/cartodb/carto_data.js index 9c9b03f4..dc2c71ea 100644 --- a/lib/cartodb/carto_data.js +++ b/lib/cartodb/carto_data.js @@ -106,7 +106,7 @@ module.exports = function() { if (check_result === 1) { // authorized by key, login as db owner that.getId(req, function(err, user_id) { - if (err) throw new Error(err); + if (err) throw err; var dbuser = _.template(global.settings.postgres_auth_user, {user_id: user_id}); _.extend(req, {dbuser:dbuser}); callback(err, true); From 56319a5ac03af98658e2472447f01af0b66994e2 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 15:24:25 +0100 Subject: [PATCH 20/46] Improvements to the fd checker 1. Finds listening processes automatically 2. Reports highest value among processes for each connection type 3. Reduces lsof calls 4. Uses munin-like output --- tools/checkfds.sh | 56 +++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index 1bc53a65..cd835406 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -1,42 +1,42 @@ #!/bin/sh -# Sorry, you must currently manually edit the regexp to make this work -# on your machine. +http_port=8181 +db_port=6432 +redis_port=6379 -master_pid=$(ps xa | grep windshaft | grep -v local | grep -v grep | awk '{print $1}') +pids=$(lsof -i :${http_port} | grep LISTEN | awk '{print $2}') +nworkers=$(echo "${pids}" | wc -l) +pids=$(echo "${pids}" | paste -sd ' ') -# TODO: use pid files -worker_pids=$(ps xa | grep windshaft | grep local | awk '{print $1}' | - python -c "import sys; print ','.join((x.strip() for x in sys.stdin.readlines()))") +tmpreport="/tmp/checkfd.$$.txt" -if test -z "${worker_pids}"; then - echo "No workers found" - exit 1 -fi +lsof -p $(echo "${pids}" | tr ' ' ',') > "${tmpreport}" -echo "Master: $master_pid" -echo "Workers: $worker_pids" +maxdb=0 +maxredis=0 +maxhttp=0 +maxtot=0 -for pid in $(echo $worker_pids | tr ',' ' '); do +for pid in ${pids}; do - pidrep="/tmp/checkfd.$pid.txt" + cnt=$(grep "${pid}" "${tmpreport}" | grep ":${db_port} " | wc -l); + if test $cnt -gt $maxdb; then maxdb=$cnt; fi + + cnt=$(grep "${pid}" "${tmpreport}" | grep ":${redis_port} " | wc -l); + if test $cnt -gt $maxredis; then maxredis=$cnt; fi - lsof -p $pid > "${pidrep}" + cnt=$(grep "${pid}" "${tmpreport}" | grep ":${http_port} " | grep -v "LISTEN" | wc -l); + if test $cnt -gt $maxhttp; then maxhttp=$cnt; fi - echo -n "worker $pid postgres: " - cat "${pidrep}" | grep ':6432 .EST' | wc -l; - - echo -n "worker $pid redis: " - cat "${pidrep}" | grep ':6379 .EST' | wc -l; - - echo -n "worker $pid incoming http: " - cat "${pidrep}" | grep ':8181' | wc -l; - - echo -n "worker $pid total: " - cat "${pidrep}" | wc -l; + cnt=$(grep "${pid}" "${tmpreport}" | wc -l); + if test $cnt -gt $maxtot; then maxtot=$cnt; fi done +echo "procs.value ${nworkers}" +echo "pgsql.value ${maxdb}" +echo "redis.value ${maxredis}" +echo "http.value ${maxhttp}" +echo "nfd.value ${maxtot}" -echo -n "master $master_pid total: " -lsof -p $master_pid | grep node | wc -l; +rm -f "${tmpreport}" From d1d2074146f99a65fb5827bd70b462098253fd05 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 16:08:24 +0100 Subject: [PATCH 21/46] Further improvements: support specifying a TILER_ENVIRONMENT env variable .. or the same thing (a filename) as a command line argument --- tools/checkfds.sh | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index cd835406..ed0b124f 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -1,13 +1,46 @@ #!/bin/sh -http_port=8181 -db_port=6432 -redis_port=6379 +me=$0 +if test -h "$me"; then + me=`readlink $me` +fi +ENV_DIR=$(cd `dirname "$me"`/../config/environments || exit 1; pwd) + +echo "ENV_DIR: ${ENV_DIR}" + +if test -z "$TILER_ENVIRONMENT"; then + TILER_ENVIRONMENT=${ENV_DIR}/development.js +fi + +if test "$1" = "config"; then +cat <<'EOM' +graph_title Tiler fd usage +graph_vlabel tiler fds +procs.label Number of tiler processes +pgsql.label PostgreSQL connections (max) +redis.label Redis connections (max) +http.label Incoming http requests (max) +nfd.label Number of open file descriptors (max) +EOM +exit 0 +elif test x"$1" != "x"; then + # override env file + TILER_ENVIRONMENT="${ENV_DIR}/${1}.js" +fi + +http_port=$(echo "console.log(require('${TILER_ENVIRONMENT}').port)" | node) || exit 1 +pgsql_port=$(echo "console.log(require('${TILER_ENVIRONMENT}').postgres.port)" | node) || exit 1 +redis_port=$(echo "console.log(require('${TILER_ENVIRONMENT}').redis.port)" | node) || exit 1 pids=$(lsof -i :${http_port} | grep LISTEN | awk '{print $2}') nworkers=$(echo "${pids}" | wc -l) pids=$(echo "${pids}" | paste -sd ' ') +if test -z "${pids}"; then + echo "No processes found listening on tcp port '${http_port}'" >&2 + exit 1 +fi + tmpreport="/tmp/checkfd.$$.txt" lsof -p $(echo "${pids}" | tr ' ' ',') > "${tmpreport}" @@ -19,7 +52,7 @@ maxtot=0 for pid in ${pids}; do - cnt=$(grep "${pid}" "${tmpreport}" | grep ":${db_port} " | wc -l); + cnt=$(grep "${pid}" "${tmpreport}" | grep ":${pgsql_port} " | wc -l); if test $cnt -gt $maxdb; then maxdb=$cnt; fi cnt=$(grep "${pid}" "${tmpreport}" | grep ":${redis_port} " | wc -l); From c314640c3b54a52d22b6ae7fee8c852a7d91ea5e Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 16:10:56 +0100 Subject: [PATCH 22/46] Remove debugging output (munin wouldn't like it) --- tools/checkfds.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index ed0b124f..81e3b88d 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -6,8 +6,6 @@ if test -h "$me"; then fi ENV_DIR=$(cd `dirname "$me"`/../config/environments || exit 1; pwd) -echo "ENV_DIR: ${ENV_DIR}" - if test -z "$TILER_ENVIRONMENT"; then TILER_ENVIRONMENT=${ENV_DIR}/development.js fi From 7dd7d09cf5394729fb3859085cc5b6bb81283438 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 16:44:34 +0100 Subject: [PATCH 23/46] Add Makefile rule to install munin plugin --- tools/checkfds.sh | 23 ++++++++++------------- tools/munin/Makefile | 17 +++++++++++++++++ tools/munin/windshaft_fds.conf.in | 5 +++++ 3 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 tools/munin/Makefile create mode 100644 tools/munin/windshaft_fds.conf.in diff --git a/tools/checkfds.sh b/tools/checkfds.sh index 81e3b88d..c43b0bb3 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -1,15 +1,5 @@ #!/bin/sh -me=$0 -if test -h "$me"; then - me=`readlink $me` -fi -ENV_DIR=$(cd `dirname "$me"`/../config/environments || exit 1; pwd) - -if test -z "$TILER_ENVIRONMENT"; then - TILER_ENVIRONMENT=${ENV_DIR}/development.js -fi - if test "$1" = "config"; then cat <<'EOM' graph_title Tiler fd usage @@ -21,9 +11,16 @@ http.label Incoming http requests (max) nfd.label Number of open file descriptors (max) EOM exit 0 -elif test x"$1" != "x"; then - # override env file - TILER_ENVIRONMENT="${ENV_DIR}/${1}.js" +fi + +if test x"$1" != x; then + TILER_ENVIRONMENT=$(cd $(dirname $0); pwd)/../config/environments/${1}.js +fi + +if test -z "$TILER_ENVIRONMENT"; then + echo "Usage: $0 []" >&2 + echo " or: [TILER_ENVIRONMENT=] $0" >&2 + exit 1 fi http_port=$(echo "console.log(require('${TILER_ENVIRONMENT}').port)" | node) || exit 1 diff --git a/tools/munin/Makefile b/tools/munin/Makefile new file mode 100644 index 00000000..04257833 --- /dev/null +++ b/tools/munin/Makefile @@ -0,0 +1,17 @@ +MUNIN_PLUGINS_DIR=/etc/munin/plugins +MUNIN_PLUGINS_CONFIG_DIR=/etc/munin/plugin-conf.d +PWD=$(shell pwd) + +all: windshaft_fds.conf + +windshaft_fds.conf: windshaft_fds.conf.in + sed 's#@PWD@#$(PWD)#' < $< > $@ + +install-munin-plugin: windshaft_fds.conf + install -m 644 windshaft_fds.conf $(MUNIN_PLUGINS_CONFIG_DIR)/windshaft_fds.conf + install -m 755 ../checkfds.sh $(MUNIN_PLUGINS_DIR)/windshaft_fds + +install: install-munin-plugin + +clean: + rm -f windshaft_fds.conf diff --git a/tools/munin/windshaft_fds.conf.in b/tools/munin/windshaft_fds.conf.in new file mode 100644 index 00000000..2579a221 --- /dev/null +++ b/tools/munin/windshaft_fds.conf.in @@ -0,0 +1,5 @@ +# Configuration file for munin plugin + +[windshaft_fds] +user root +env.TILER_ENVIRONMENT @PWD@/../../config/environments/production.js From 60b578ae56a0404397619fc15641cb62d2ba1364 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 16:47:59 +0100 Subject: [PATCH 24/46] Report environment name in munin graph --- tools/checkfds.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index c43b0bb3..38690394 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -1,8 +1,10 @@ #!/bin/sh +envnik=$(basename "${TILER_ENVIRONMENT}" .js) + if test "$1" = "config"; then -cat <<'EOM' -graph_title Tiler fd usage +echo "graph_title Tiler fd usage (${envnik})" +cat <<"EOM" graph_vlabel tiler fds procs.label Number of tiler processes pgsql.label PostgreSQL connections (max) From 6476b975d4afa1c6ab4c77111433c67a520a23ba Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 16:48:42 +0100 Subject: [PATCH 25/46] Ignore generated munin plugin config file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fc482c42..75e558e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules config/environments/*.js .idea +tools/munin/windshaft_fds.conf From 39c0d3a9a4ae61d1c18b1a69cd01122d942da5dd Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 17:05:43 +0100 Subject: [PATCH 26/46] tweak graph labels of munin plugin --- tools/checkfds.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index 38690394..59b64603 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -3,14 +3,15 @@ envnik=$(basename "${TILER_ENVIRONMENT}" .js) if test "$1" = "config"; then -echo "graph_title Tiler fd usage (${envnik})" +echo "graph_title fd usage (${envnik})" cat <<"EOM" -graph_vlabel tiler fds +graph_vlabel number of file descriptors +graph_category windshaft procs.label Number of tiler processes pgsql.label PostgreSQL connections (max) redis.label Redis connections (max) http.label Incoming http requests (max) -nfd.label Number of open file descriptors (max) +nfd.label Total file descriptors (max) EOM exit 0 fi From 6e6c1101fe6a7a1119c047c827d0ea11dfb56edd Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 17:48:54 +0100 Subject: [PATCH 27/46] avoid scaling counters (munin) --- tools/checkfds.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index 59b64603..220b2bf9 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -7,6 +7,7 @@ echo "graph_title fd usage (${envnik})" cat <<"EOM" graph_vlabel number of file descriptors graph_category windshaft +graph_scale no procs.label Number of tiler processes pgsql.label PostgreSQL connections (max) redis.label Redis connections (max) From b3f8515fd5cb343dc521793026932b45917110b8 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 8 Feb 2013 18:17:15 +0100 Subject: [PATCH 28/46] Fix regexp to find incoming http connections (munin fds plugin) --- tools/checkfds.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index 220b2bf9..61654c06 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -57,7 +57,7 @@ for pid in ${pids}; do cnt=$(grep "${pid}" "${tmpreport}" | grep ":${redis_port} " | wc -l); if test $cnt -gt $maxredis; then maxredis=$cnt; fi - cnt=$(grep "${pid}" "${tmpreport}" | grep ":${http_port} " | grep -v "LISTEN" | wc -l); + cnt=$(grep "${pid}" "${tmpreport}" | grep ":${http_port}-" | grep -v "LISTEN" | wc -l); if test $cnt -gt $maxhttp; then maxhttp=$cnt; fi cnt=$(grep "${pid}" "${tmpreport}" | wc -l); From 031c6ee0cd0bed56854a6d9a8fee2e38415aaf6d Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 11 Feb 2013 13:41:51 +0100 Subject: [PATCH 29/46] Allow "staging" as env name from app.js --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 225f8e64..845a3cd6 100755 --- a/app.js +++ b/app.js @@ -10,9 +10,9 @@ // sanity check var ENV = process.argv[2] -if (ENV != 'development' && ENV != 'production'){ +if (ENV != 'development' && ENV != 'production' && ENV != 'staging' ){ console.error("\nnode app.js [environment]"); - console.error("environments: [development, production]\n"); + console.error("environments: [development, production, staging]\n"); process.exit(1); } From a79b999e7a01b320b6d30389a8f131ab0d219448 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 11 Feb 2013 15:05:23 +0100 Subject: [PATCH 30/46] Do not try to send commands to an unoconnected redis client This changes "Cannot read property 'HGET' of null" messages into "Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED". --- lib/cartodb/carto_data.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cartodb/carto_data.js b/lib/cartodb/carto_data.js index dc2c71ea..e43b7233 100644 --- a/lib/cartodb/carto_data.js +++ b/lib/cartodb/carto_data.js @@ -223,6 +223,7 @@ module.exports = function() { redis_pool.acquire(db, this); }, function executeQuery(err, data) { + if ( err ) throw err; redisClient = data; redisArgs.push(this); redisClient[redisFunc.toUpperCase()].apply(redisClient, redisArgs); From fb33583df937e02c678629bb3e1724bc6d0341a3 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 11 Feb 2013 15:10:41 +0100 Subject: [PATCH 31/46] Update news file --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index a9e5cc78..2d03a1bb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ * Require grainstore 0.10.9, fixing an issue with multi-geom markers * Enhance run_tests.sh to allow running single tests and skipping preparation * Fix async throws in getGeometryType, getInfoWindow and getMapMetadata +* Survive connection refusals from redis 1.1.5 (DD//MM//YY) ----- From 219caf7eab69456e129c8b1180113d5b8961f52c Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 11 Feb 2013 16:39:21 +0100 Subject: [PATCH 32/46] Require windshaft 0.8.5 with some stability issue fixed Additionally we can now control renderer cache time to live and metatiling --- NEWS.md | 1 + npm-shrinkwrap.json | 240 ++++++++++++++++++++++++++++++-------------- 2 files changed, 168 insertions(+), 73 deletions(-) diff --git a/NEWS.md b/NEWS.md index 2d03a1bb..24ac6b3d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ 1.1.6 ----- +* Require windshaft 0.8.5, fixing some stability issues * Require grainstore 0.10.9, fixing an issue with multi-geom markers * Enhance run_tests.sh to allow running single tests and skipping preparation * Fix async throws in getGeometryType, getInfoWindow and getMapMetadata diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 733a29dc..c3768764 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,44 +1,54 @@ { "name": "windshaft-cartodb", - "version": "1.1.5", + "version": "1.1.6", "dependencies": { "cluster2": { "version": "0.3.5-cdb02", - "from": "git://github.com/CartoDB/cluster2.git#cdb_production", + "from": "cluster2@git://github.com/CartoDB/cluster2.git#cdb_production", "dependencies": { "express": { "version": "2.5.11", + "from": "express@2.5.11", "dependencies": { "connect": { "version": "1.9.2", + "from": "connect@1.x", "dependencies": { "formidable": { - "version": "1.0.11" + "version": "1.0.11", + "from": "formidable@1.0.x" } } }, "mime": { - "version": "1.2.4" + "version": "1.2.4", + "from": "mime@1.2.4" }, "qs": { - "version": "0.4.2" + "version": "0.4.2", + "from": "qs@0.4.x" }, "mkdirp": { - "version": "0.3.0" + "version": "0.3.0", + "from": "mkdirp@0.3.0" } } }, "ejs": { - "version": "0.8.3" + "version": "0.8.3", + "from": "ejs@" }, "npm": { "version": "1.1.69", + "from": "npm@", "dependencies": { "semver": { - "version": "1.1.1" + "version": "1.1.1", + "from": "semver@~1.1.0" }, "ini": { - "version": "1.0.5" + "version": "1.0.5", + "from": "ini@latest" }, "slide": { "version": "1.1.3" @@ -47,157 +57,198 @@ "version": "1.0.3" }, "graceful-fs": { - "version": "1.1.14" + "version": "1.1.14", + "from": "graceful-fs@~1.1.1" }, "minimatch": { "version": "0.2.9", + "from": "minimatch@~0.2.8", "dependencies": { "sigmund": { - "version": "1.0.0" + "version": "1.0.0", + "from": "sigmund@~1.0.0" } } }, "nopt": { - "version": "2.0.0" + "version": "2.0.0", + "from": "nopt@latest" }, "rimraf": { - "version": "2.0.2" + "version": "2.0.2", + "from": "rimraf@2" }, "request": { "version": "2.9.203", "from": "git://github.com/isaacs/request" }, "which": { - "version": "1.0.5" + "version": "1.0.5", + "from": "which@1" }, "tar": { - "version": "0.1.14" + "version": "0.1.14", + "from": "tar@~0.1.12" }, "fstream": { - "version": "0.1.19" + "version": "0.1.19", + "from": "../fstream" }, "block-stream": { - "version": "0.0.6" + "version": "0.0.6", + "from": "block-stream@*" }, "inherits": { "version": "1.0.0", "from": "git://github.com/isaacs/inherits" }, "mkdirp": { - "version": "0.3.4" + "version": "0.3.4", + "from": "mkdirp@~0.3.3" }, "read": { "version": "1.0.4", + "from": "read@~1.0.3", "dependencies": { "mute-stream": { - "version": "0.0.3" + "version": "0.0.3", + "from": "mute-stream@~0.0.2" } } }, "lru-cache": { - "version": "2.0.4" + "version": "2.0.4", + "from": "lru-cache@~2.0.0" }, "node-gyp": { - "version": "0.7.3" + "version": "0.7.3", + "from": "node-gyp@~0.7.1" }, "fstream-npm": { "version": "0.1.3", + "from": "fstream-npm@latest", "dependencies": { "fstream-ignore": { - "version": "0.0.5" + "version": "0.0.5", + "from": "fstream-ignore@~0.0.5" } } }, "uid-number": { - "version": "0.0.3" + "version": "0.0.3", + "from": "../uid-number" }, "archy": { - "version": "0.0.2" + "version": "0.0.2", + "from": "archy@0.0.2" }, "chownr": { - "version": "0.0.1" + "version": "0.0.1", + "from": "../chownr" }, "npmlog": { - "version": "0.0.2" + "version": "0.0.2", + "from": "npmlog@0" }, "ansi": { - "version": "0.1.2" + "version": "0.1.2", + "from": "ansi@~0.1.2" }, "npm-registry-client": { "version": "0.2.10", + "from": "npm-registry-client@latest", "dependencies": { "couch-login": { - "version": "0.1.15" + "version": "0.1.15", + "from": "couch-login@~0.1.15" } } }, "read-package-json": { - "version": "0.1.11" + "version": "0.1.11", + "from": "read-package-json@~0.1.8" }, "read-installed": { - "version": "0.0.3" + "version": "0.0.3", + "from": "read-installed@0" }, "glob": { - "version": "3.1.14" + "version": "3.1.14", + "from": "glob@3.1.14" }, "init-package-json": { "version": "0.0.6", + "from": "init-package-json@0.0.6", "dependencies": { "promzard": { - "version": "0.2.0" + "version": "0.2.0", + "from": "promzard@~0.2.0" } } }, "osenv": { - "version": "0.0.3" + "version": "0.0.3", + "from": "osenv@latest" }, "lockfile": { - "version": "0.2.1" + "version": "0.2.1", + "from": "lockfile@>=0.2" }, "retry": { - "version": "0.6.0" + "version": "0.6.0", + "from": "retry" }, "once": { - "version": "1.1.1" + "version": "1.1.1", + "from": "once" }, "npmconf": { "version": "0.0.16", + "from": "npmconf@0", "dependencies": { "config-chain": { "version": "1.1.3", + "from": "config-chain@~1.1.1", "dependencies": { "proto-list": { - "version": "1.2.2" + "version": "1.2.2", + "from": "proto-list@~1.2.1" } } } } }, "opener": { - "version": "1.3.0" + "version": "1.3.0", + "from": "opener@latest" } } } } }, "node-varnish": { - "version": "0.1.1" + "version": "0.1.1", + "from": "node-varnish@0.1.1" }, "underscore": { - "version": "1.3.3" + "version": "1.3.3", + "from": "underscore@~1.3.3" }, "grainstore": { "version": "0.10.10", + "from": "grainstore@0.10.10", "dependencies": { "carto": { "version": "0.9.3-cdb2", - "from": "git://github.com/CartoDB/carto.git#cdb-0.9", + "from": "carto@git://github.com/CartoDB/carto.git#cdb-0.9", "dependencies": { "xml2js": { "version": "0.1.14", + "from": "xml2js@0.1.14", "dependencies": { "sax": { - "version": "0.4.2" + "version": "0.4.2", + "from": "sax@0.4.2" } } } @@ -205,152 +256,195 @@ }, "mapnik-reference": { "version": "5.0.0-cdb1", - "from": "git://github.com/CartoDB/mapnik-reference.git#cdb-5.0" + "from": "mapnik-reference@git://github.com/CartoDB/mapnik-reference.git#cdb-5.0" }, "millstone": { "version": "0.5.13", + "from": "millstone@0.5.13", "dependencies": { "request": { "version": "2.11.4", + "from": "request@2.11.4", "dependencies": { "form-data": { "version": "0.0.3", + "from": "form-data", "dependencies": { "combined-stream": { "version": "0.0.3", + "from": "combined-stream@0.0.3", "dependencies": { "delayed-stream": { - "version": "0.0.5" + "version": "0.0.5", + "from": "delayed-stream@0.0.5" } } }, "async": { - "version": "0.1.9" + "version": "0.1.9", + "from": "async@0.1.9" } } }, "mime": { - "version": "1.2.7" + "version": "1.2.7", + "from": "mime" } } }, "srs": { - "version": "0.2.18" + "version": "0.2.18", + "from": "srs@0.2.18" }, "zipfile": { - "version": "0.3.3" + "version": "0.3.3", + "from": "zipfile@0.3.3" }, "sqlite3": { - "version": "2.1.5" + "version": "2.1.5", + "from": "sqlite3@2.1.5" }, "mime": { - "version": "1.2.7" + "version": "1.2.7", + "from": "mime@1.2.7" }, "mkdirp": { - "version": "0.3.4" + "version": "0.3.4", + "from": "mkdirp@0.3.4" } } } } }, "windshaft": { - "version": "0.8.4", + "version": "0.8.5", + "from": "windshaft@~0.8.4", "dependencies": { "express": { "version": "2.5.11", + "from": "express@2.5.11", + "resolved": "https://registry.npmjs.org/express/-/express-2.5.11.tgz", "dependencies": { "connect": { "version": "1.9.2", + "from": "connect@1.x", "dependencies": { "formidable": { - "version": "1.0.11" + "version": "1.0.11", + "from": "formidable@1.0.x" } } }, "mime": { - "version": "1.2.4" + "version": "1.2.4", + "from": "mime@1.2.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.4.tgz" }, "qs": { - "version": "0.4.2" + "version": "0.4.2", + "from": "qs@0.4.x" }, "mkdirp": { - "version": "0.3.0" + "version": "0.3.0", + "from": "mkdirp@0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" } } }, "tilelive": { "version": "4.3.3", + "from": "tilelive@~4.3.1", "dependencies": { "optimist": { "version": "0.3.5", + "from": "optimist@~0.3.1", "dependencies": { "wordwrap": { - "version": "0.0.2" + "version": "0.0.2", + "from": "wordwrap@~0.0.2" } } }, "sphericalmercator": { - "version": "1.0.2" + "version": "1.0.2", + "from": "sphericalmercator@~1.0.1" } } }, "tilelive-mapnik": { "version": "0.3.3-cdb2", - "from": "git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a", + "from": "tilelive-mapnik@git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a", + "resolved": "git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a6002ba10fe2d48172ab63199d7060832", "dependencies": { "eio": { - "version": "0.1.0" + "version": "0.1.0", + "from": "eio@~0.1.0" }, "sphericalmercator": { - "version": "1.0.2" + "version": "1.0.2", + "from": "sphericalmercator@~1.0.1" } } } } }, "step": { - "version": "0.0.5" + "version": "0.0.5", + "from": "step@0.0.x" }, "generic-pool": { - "version": "1.0.12" + "version": "1.0.12", + "from": "generic-pool@1.0.x" }, "redis": { - "version": "0.7.2" + "version": "0.7.2", + "from": "redis@0.7.2" }, "hiredis": { - "version": "0.1.14" + "version": "0.1.14", + "from": "hiredis@~0.1.14" }, "request": { - "version": "2.9.202" + "version": "2.9.202", + "from": "request@2.9.202" }, "mapnik": { - "version": "0.7.18" + "version": "0.7.18", + "from": "mapnik@~0.7.14" }, "semver": { - "version": "1.1.1" + "version": "1.1.1", + "from": "semver@~1.1.0" }, "mocha": { "version": "1.2.1", + "from": "mocha@1.2.1", "dependencies": { "commander": { - "version": "0.6.1" + "version": "0.6.1", + "from": "commander@0.6.1" }, "growl": { - "version": "1.5.1" + "version": "1.5.1", + "from": "growl@1.5.x" }, "jade": { "version": "0.26.3", + "from": "jade@0.26.3", "dependencies": { "mkdirp": { - "version": "0.3.0" + "version": "0.3.0", + "from": "mkdirp@0.3.0" } } }, "diff": { - "version": "1.0.2" + "version": "1.0.2", + "from": "diff@1.0.2" }, "debug": { - "version": "0.7.0" + "version": "0.7.0", + "from": "debug@*" } } } From 3c5e358c32ed3eb35b99e6f247700a8e5296fb8f Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 11 Feb 2013 17:05:44 +0100 Subject: [PATCH 33/46] Regenerated npm-shrinkwrap.json with npm-1.1.x See https://github.com/isaacs/npm/issues/3145 for the rationale --- npm-shrinkwrap.json | 236 +++++++++++++------------------------------- 1 file changed, 71 insertions(+), 165 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c3768764..6769eeca 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -4,51 +4,41 @@ "dependencies": { "cluster2": { "version": "0.3.5-cdb02", - "from": "cluster2@git://github.com/CartoDB/cluster2.git#cdb_production", + "from": "git://github.com/CartoDB/cluster2.git#cdb_production", "dependencies": { "express": { "version": "2.5.11", - "from": "express@2.5.11", "dependencies": { "connect": { "version": "1.9.2", - "from": "connect@1.x", "dependencies": { "formidable": { - "version": "1.0.11", - "from": "formidable@1.0.x" + "version": "1.0.11" } } }, "mime": { - "version": "1.2.4", - "from": "mime@1.2.4" + "version": "1.2.4" }, "qs": { - "version": "0.4.2", - "from": "qs@0.4.x" + "version": "0.4.2" }, "mkdirp": { - "version": "0.3.0", - "from": "mkdirp@0.3.0" + "version": "0.3.0" } } }, "ejs": { - "version": "0.8.3", - "from": "ejs@" + "version": "0.8.3" }, "npm": { "version": "1.1.69", - "from": "npm@", "dependencies": { "semver": { - "version": "1.1.1", - "from": "semver@~1.1.0" + "version": "1.1.1" }, "ini": { - "version": "1.0.5", - "from": "ini@latest" + "version": "1.0.5" }, "slide": { "version": "1.1.3" @@ -57,198 +47,157 @@ "version": "1.0.3" }, "graceful-fs": { - "version": "1.1.14", - "from": "graceful-fs@~1.1.1" + "version": "1.1.14" }, "minimatch": { "version": "0.2.9", - "from": "minimatch@~0.2.8", "dependencies": { "sigmund": { - "version": "1.0.0", - "from": "sigmund@~1.0.0" + "version": "1.0.0" } } }, "nopt": { - "version": "2.0.0", - "from": "nopt@latest" + "version": "2.0.0" }, "rimraf": { - "version": "2.0.2", - "from": "rimraf@2" + "version": "2.0.2" }, "request": { "version": "2.9.203", "from": "git://github.com/isaacs/request" }, "which": { - "version": "1.0.5", - "from": "which@1" + "version": "1.0.5" }, "tar": { - "version": "0.1.14", - "from": "tar@~0.1.12" + "version": "0.1.14" }, "fstream": { - "version": "0.1.19", - "from": "../fstream" + "version": "0.1.19" }, "block-stream": { - "version": "0.0.6", - "from": "block-stream@*" + "version": "0.0.6" }, "inherits": { "version": "1.0.0", "from": "git://github.com/isaacs/inherits" }, "mkdirp": { - "version": "0.3.4", - "from": "mkdirp@~0.3.3" + "version": "0.3.4" }, "read": { "version": "1.0.4", - "from": "read@~1.0.3", "dependencies": { "mute-stream": { - "version": "0.0.3", - "from": "mute-stream@~0.0.2" + "version": "0.0.3" } } }, "lru-cache": { - "version": "2.0.4", - "from": "lru-cache@~2.0.0" + "version": "2.0.4" }, "node-gyp": { - "version": "0.7.3", - "from": "node-gyp@~0.7.1" + "version": "0.7.3" }, "fstream-npm": { "version": "0.1.3", - "from": "fstream-npm@latest", "dependencies": { "fstream-ignore": { - "version": "0.0.5", - "from": "fstream-ignore@~0.0.5" + "version": "0.0.5" } } }, "uid-number": { - "version": "0.0.3", - "from": "../uid-number" + "version": "0.0.3" }, "archy": { - "version": "0.0.2", - "from": "archy@0.0.2" + "version": "0.0.2" }, "chownr": { - "version": "0.0.1", - "from": "../chownr" + "version": "0.0.1" }, "npmlog": { - "version": "0.0.2", - "from": "npmlog@0" + "version": "0.0.2" }, "ansi": { - "version": "0.1.2", - "from": "ansi@~0.1.2" + "version": "0.1.2" }, "npm-registry-client": { "version": "0.2.10", - "from": "npm-registry-client@latest", "dependencies": { "couch-login": { - "version": "0.1.15", - "from": "couch-login@~0.1.15" + "version": "0.1.15" } } }, "read-package-json": { - "version": "0.1.11", - "from": "read-package-json@~0.1.8" + "version": "0.1.11" }, "read-installed": { - "version": "0.0.3", - "from": "read-installed@0" + "version": "0.0.3" }, "glob": { - "version": "3.1.14", - "from": "glob@3.1.14" + "version": "3.1.14" }, "init-package-json": { "version": "0.0.6", - "from": "init-package-json@0.0.6", "dependencies": { "promzard": { - "version": "0.2.0", - "from": "promzard@~0.2.0" + "version": "0.2.0" } } }, "osenv": { - "version": "0.0.3", - "from": "osenv@latest" + "version": "0.0.3" }, "lockfile": { - "version": "0.2.1", - "from": "lockfile@>=0.2" + "version": "0.2.1" }, "retry": { - "version": "0.6.0", - "from": "retry" + "version": "0.6.0" }, "once": { - "version": "1.1.1", - "from": "once" + "version": "1.1.1" }, "npmconf": { "version": "0.0.16", - "from": "npmconf@0", "dependencies": { "config-chain": { "version": "1.1.3", - "from": "config-chain@~1.1.1", "dependencies": { "proto-list": { - "version": "1.2.2", - "from": "proto-list@~1.2.1" + "version": "1.2.2" } } } } }, "opener": { - "version": "1.3.0", - "from": "opener@latest" + "version": "1.3.0" } } } } }, "node-varnish": { - "version": "0.1.1", - "from": "node-varnish@0.1.1" + "version": "0.1.1" }, "underscore": { - "version": "1.3.3", - "from": "underscore@~1.3.3" + "version": "1.3.3" }, "grainstore": { "version": "0.10.10", - "from": "grainstore@0.10.10", "dependencies": { "carto": { "version": "0.9.3-cdb2", - "from": "carto@git://github.com/CartoDB/carto.git#cdb-0.9", + "from": "git://github.com/CartoDB/carto.git#cdb-0.9", "dependencies": { "xml2js": { "version": "0.1.14", - "from": "xml2js@0.1.14", "dependencies": { "sax": { - "version": "0.4.2", - "from": "sax@0.4.2" + "version": "0.4.2" } } } @@ -256,61 +205,49 @@ }, "mapnik-reference": { "version": "5.0.0-cdb1", - "from": "mapnik-reference@git://github.com/CartoDB/mapnik-reference.git#cdb-5.0" + "from": "git://github.com/CartoDB/mapnik-reference.git#cdb-5.0" }, "millstone": { "version": "0.5.13", - "from": "millstone@0.5.13", "dependencies": { "request": { "version": "2.11.4", - "from": "request@2.11.4", "dependencies": { "form-data": { "version": "0.0.3", - "from": "form-data", "dependencies": { "combined-stream": { "version": "0.0.3", - "from": "combined-stream@0.0.3", "dependencies": { "delayed-stream": { - "version": "0.0.5", - "from": "delayed-stream@0.0.5" + "version": "0.0.5" } } }, "async": { - "version": "0.1.9", - "from": "async@0.1.9" + "version": "0.1.9" } } }, "mime": { - "version": "1.2.7", - "from": "mime" + "version": "1.2.7" } } }, "srs": { - "version": "0.2.18", - "from": "srs@0.2.18" + "version": "0.2.18" }, "zipfile": { - "version": "0.3.3", - "from": "zipfile@0.3.3" + "version": "0.3.3" }, "sqlite3": { - "version": "2.1.5", - "from": "sqlite3@2.1.5" + "version": "2.1.5" }, "mime": { - "version": "1.2.7", - "from": "mime@1.2.7" + "version": "1.2.7" }, "mkdirp": { - "version": "0.3.4", - "from": "mkdirp@0.3.4" + "version": "0.3.4" } } } @@ -318,133 +255,102 @@ }, "windshaft": { "version": "0.8.5", - "from": "windshaft@~0.8.4", "dependencies": { "express": { "version": "2.5.11", - "from": "express@2.5.11", - "resolved": "https://registry.npmjs.org/express/-/express-2.5.11.tgz", "dependencies": { "connect": { "version": "1.9.2", - "from": "connect@1.x", "dependencies": { "formidable": { - "version": "1.0.11", - "from": "formidable@1.0.x" + "version": "1.0.11" } } }, "mime": { - "version": "1.2.4", - "from": "mime@1.2.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.4.tgz" + "version": "1.2.4" }, "qs": { - "version": "0.4.2", - "from": "qs@0.4.x" + "version": "0.4.2" }, "mkdirp": { - "version": "0.3.0", - "from": "mkdirp@0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" + "version": "0.3.0" } } }, "tilelive": { "version": "4.3.3", - "from": "tilelive@~4.3.1", "dependencies": { "optimist": { "version": "0.3.5", - "from": "optimist@~0.3.1", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "wordwrap@~0.0.2" + "version": "0.0.2" } } }, "sphericalmercator": { - "version": "1.0.2", - "from": "sphericalmercator@~1.0.1" + "version": "1.0.2" } } }, "tilelive-mapnik": { "version": "0.3.3-cdb2", - "from": "tilelive-mapnik@git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a", - "resolved": "git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a6002ba10fe2d48172ab63199d7060832", + "from": "git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a", "dependencies": { "eio": { - "version": "0.1.0", - "from": "eio@~0.1.0" + "version": "0.1.0" }, "sphericalmercator": { - "version": "1.0.2", - "from": "sphericalmercator@~1.0.1" + "version": "1.0.2" } } } } }, "step": { - "version": "0.0.5", - "from": "step@0.0.x" + "version": "0.0.5" }, "generic-pool": { - "version": "1.0.12", - "from": "generic-pool@1.0.x" + "version": "1.0.12" }, "redis": { - "version": "0.7.2", - "from": "redis@0.7.2" + "version": "0.7.2" }, "hiredis": { - "version": "0.1.14", - "from": "hiredis@~0.1.14" + "version": "0.1.14" }, "request": { - "version": "2.9.202", - "from": "request@2.9.202" + "version": "2.9.202" }, "mapnik": { - "version": "0.7.18", - "from": "mapnik@~0.7.14" + "version": "0.7.18" }, "semver": { - "version": "1.1.1", - "from": "semver@~1.1.0" + "version": "1.1.1" }, "mocha": { "version": "1.2.1", - "from": "mocha@1.2.1", "dependencies": { "commander": { - "version": "0.6.1", - "from": "commander@0.6.1" + "version": "0.6.1" }, "growl": { - "version": "1.5.1", - "from": "growl@1.5.x" + "version": "1.5.1" }, "jade": { "version": "0.26.3", - "from": "jade@0.26.3", "dependencies": { "mkdirp": { - "version": "0.3.0", - "from": "mkdirp@0.3.0" + "version": "0.3.0" } } }, "diff": { - "version": "1.0.2", - "from": "diff@1.0.2" + "version": "1.0.2" }, "debug": { - "version": "0.7.0", - "from": "debug@*" + "version": "0.7.0" } } } From 3101dbd43325947fe3a533c87ef57059479179ca Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 11 Feb 2013 17:35:17 +0100 Subject: [PATCH 34/46] Add cache count to the stats reported by checkfds.sh (munin plugin) --- tools/checkfds.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/checkfds.sh b/tools/checkfds.sh index 61654c06..8c265720 100755 --- a/tools/checkfds.sh +++ b/tools/checkfds.sh @@ -12,6 +12,7 @@ procs.label Number of tiler processes pgsql.label PostgreSQL connections (max) redis.label Redis connections (max) http.label Incoming http requests (max) +caches.label Number of renderer caches (max) nfd.label Total file descriptors (max) EOM exit 0 @@ -48,6 +49,7 @@ maxdb=0 maxredis=0 maxhttp=0 maxtot=0 +maxcache=0 for pid in ${pids}; do @@ -63,12 +65,23 @@ for pid in ${pids}; do cnt=$(grep "${pid}" "${tmpreport}" | wc -l); if test $cnt -gt $maxtot; then maxtot=$cnt; fi + log=$(grep "${pid}" "${tmpreport}" | grep -w 1w | awk '{print $9}') + if test -e "${log}"; then + kill -USR1 "${pid}" + cnt=$(tac ${log} | sed -n -e '/ItemKey/p;/^RenderCache/q' | wc -l) + if test $cnt -gt $maxcache; then maxcache=$cnt; fi + else + # report the error... + maxcache=-1 + fi + done echo "procs.value ${nworkers}" echo "pgsql.value ${maxdb}" echo "redis.value ${maxredis}" echo "http.value ${maxhttp}" +echo "caches.value ${maxcache}" echo "nfd.value ${maxtot}" rm -f "${tmpreport}" From c3f53a798776f4054e142b2c9236ec08d8ef2e1a Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 11 Feb 2013 18:23:35 +0100 Subject: [PATCH 35/46] Rename munin plugin, put all under munin dir --- .gitignore | 2 +- tools/munin/Makefile | 16 +++++++++------- tools/{checkfds.sh => munin/windshaft} | 2 +- .../{windshaft_fds.conf.in => windshaft.conf.in} | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) rename tools/{checkfds.sh => munin/windshaft} (96%) rename tools/munin/{windshaft_fds.conf.in => windshaft.conf.in} (87%) diff --git a/.gitignore b/.gitignore index 75e558e9..96b65b68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ node_modules config/environments/*.js .idea -tools/munin/windshaft_fds.conf +tools/munin/windshaft.conf diff --git a/tools/munin/Makefile b/tools/munin/Makefile index 04257833..a1aa98b2 100644 --- a/tools/munin/Makefile +++ b/tools/munin/Makefile @@ -2,16 +2,18 @@ MUNIN_PLUGINS_DIR=/etc/munin/plugins MUNIN_PLUGINS_CONFIG_DIR=/etc/munin/plugin-conf.d PWD=$(shell pwd) -all: windshaft_fds.conf +all: windshaft.conf -windshaft_fds.conf: windshaft_fds.conf.in +windshaft.conf: windshaft.conf.in sed 's#@PWD@#$(PWD)#' < $< > $@ -install-munin-plugin: windshaft_fds.conf - install -m 644 windshaft_fds.conf $(MUNIN_PLUGINS_CONFIG_DIR)/windshaft_fds.conf - install -m 755 ../checkfds.sh $(MUNIN_PLUGINS_DIR)/windshaft_fds +install-munin-plugin-conf: windshaft.conf + install -m 644 $< $(MUNIN_PLUGINS_CONFIG_DIR)/windshaft.conf -install: install-munin-plugin +install-munin-plugin: windshaft + install -m 755 $< $(MUNIN_PLUGINS_DIR)/windshaft + +install: install-munin-plugin install-munin-plugin-conf clean: - rm -f windshaft_fds.conf + rm -f windshaft.conf diff --git a/tools/checkfds.sh b/tools/munin/windshaft similarity index 96% rename from tools/checkfds.sh rename to tools/munin/windshaft index 8c265720..187df71e 100755 --- a/tools/checkfds.sh +++ b/tools/munin/windshaft @@ -19,7 +19,7 @@ exit 0 fi if test x"$1" != x; then - TILER_ENVIRONMENT=$(cd $(dirname $0); pwd)/../config/environments/${1}.js + TILER_ENVIRONMENT=$(cd $(dirname $0); pwd)/../../config/environments/${1}.js fi if test -z "$TILER_ENVIRONMENT"; then diff --git a/tools/munin/windshaft_fds.conf.in b/tools/munin/windshaft.conf.in similarity index 87% rename from tools/munin/windshaft_fds.conf.in rename to tools/munin/windshaft.conf.in index 2579a221..0e71f467 100644 --- a/tools/munin/windshaft_fds.conf.in +++ b/tools/munin/windshaft.conf.in @@ -1,5 +1,5 @@ # Configuration file for munin plugin -[windshaft_fds] +[windshaft] user root env.TILER_ENVIRONMENT @PWD@/../../config/environments/production.js From 9dcf6a1acf66c88cf2e1ec3c269725640aaeccd4 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 12 Feb 2013 18:53:16 +0100 Subject: [PATCH 36/46] Set 'base_url_notable' config for Windshaft-0.9 (multilayer) --- lib/cartodb/server_options.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index 79141a2c..4fc5123f 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -8,6 +8,7 @@ var _ = require('underscore') module.exports = function(){ var me = { base_url: '/tiles/:table', + base_url_notable: '/tiles', grainstore: { datasource: global.environment.postgres, cachedir: global.environment.millstone.cache_basedir, From b81c83aace88587dff90a11a8356eb03d0fa6b13 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 19 Feb 2013 13:37:11 +0100 Subject: [PATCH 37/46] Add maxConnection and cache dump notice in NEWS for 1.1.6 --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index 24ac6b3d..c518e48a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,10 +1,12 @@ 1.1.6 ----- * Require windshaft 0.8.5, fixing some stability issues + and providing cache info on request * Require grainstore 0.10.9, fixing an issue with multi-geom markers * Enhance run_tests.sh to allow running single tests and skipping preparation * Fix async throws in getGeometryType, getInfoWindow and getMapMetadata * Survive connection refusals from redis +* Add maxConnection environment configuration, default to 128 1.1.5 (DD//MM//YY) ----- From dc188817a87d313485a753e2b1ddf102a5218e21 Mon Sep 17 00:00:00 2001 From: David Arango Date: Tue, 19 Feb 2013 13:57:14 +0100 Subject: [PATCH 38/46] Bump to 1.1.7 --- NEWS.md | 5 ++++- package.json | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index c518e48a..fa9a4392 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,7 @@ -1.1.6 +1.1.7 (DD//MM//YY) +----- + +1.1.6 (19//02//13) ----- * Require windshaft 0.8.5, fixing some stability issues and providing cache info on request diff --git a/package.json b/package.json index 8b5c2b85..52225ca9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "1.1.6", + "version": "1.1.7", "description": "A map tile server for CartoDB", "url": "https://github.com/Vizzuality/Windshaft-cartodb", "licenses": [{ From b98a0f9104cd67b9e791024afa3af95fa126bce0 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Wed, 20 Feb 2013 12:12:35 +0100 Subject: [PATCH 39/46] Do not let /etc/services confuse FD checker (munin plugin) --- NEWS.md | 1 + tools/munin/windshaft | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index fa9a4392..78405632 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ 1.1.7 (DD//MM//YY) ----- +* Do not let /etc/services confuse FD checker (munin plugin) 1.1.6 (19//02//13) ----- diff --git a/tools/munin/windshaft b/tools/munin/windshaft index 187df71e..77adcb23 100755 --- a/tools/munin/windshaft +++ b/tools/munin/windshaft @@ -43,7 +43,7 @@ fi tmpreport="/tmp/checkfd.$$.txt" -lsof -p $(echo "${pids}" | tr ' ' ',') > "${tmpreport}" +lsof -Pp $(echo "${pids}" | tr ' ' ',') > "${tmpreport}" maxdb=0 maxredis=0 From 14e3ead06e10dc374d84b93bcde419edb82847ed Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 21 Feb 2013 12:56:04 +0100 Subject: [PATCH 40/46] Add redis.max configuration setting and document it. --- config/environments/development.js.example | 8 ++++++++ config/environments/production.js.example | 8 ++++++++ config/environments/staging.js.example | 12 +++++++++++- config/environments/test.js.example | 12 ++++++++++-- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/config/environments/development.js.example b/config/environments/development.js.example index 2f65ab4d..1d97b1dd 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -35,6 +35,14 @@ var config = { ,redis: { host: '127.0.0.1', port: 6379, + // Max number of connections in each pool. + // Users will be put on a queue when the limit is hit. + // Set to maxConnection to have no possible queues. + // There are currently 3 pools involved in serving + // windshaft-cartodb requests so multiply this number + // by 3 to know how many possible connections will be + // kept open by the server. The default is 50. + max: 50, idleTimeoutMillis: 1, // idle time before dropping connection reapIntervalMillis: 1 // time between cleanups } diff --git a/config/environments/production.js.example b/config/environments/production.js.example index 9a336133..42a9dd3e 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -29,6 +29,14 @@ var config = { ,redis: { host: '127.0.0.1', port: 6379, + // Max number of connections in each pool. + // Users will be put on a queue when the limit is hit. + // Set to maxConnection to have no possible queues. + // There are currently 3 pools involved in serving + // windshaft-cartodb requests so multiply this number + // by 3 to know how many possible connections will be + // kept open by the server. The default is 50. + max: 50, idleTimeoutMillis: 30000, // idle time before dropping connection reapIntervalMillis: 1000 // time between cleanups } diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index c691468f..cd89f527 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -28,7 +28,17 @@ var config = { } ,redis: { host: '127.0.0.1', - port: 6379 + port: 6379, + // Max number of connections in each pool. + // Users will be put on a queue when the limit is hit. + // Set to maxConnection to have no possible queues. + // There are currently 3 pools involved in serving + // windshaft-cartodb requests so multiply this number + // by 3 to know how many possible connections will be + // kept open by the server. The default is 50. + max: 50, + idleTimeoutMillis: 30000, // idle time before dropping connection + reapIntervalMillis: 1000 // time between cleanups } ,sqlapi: { protocol: 'https', diff --git a/config/environments/test.js.example b/config/environments/test.js.example index a9db586f..e7221704 100644 --- a/config/environments/test.js.example +++ b/config/environments/test.js.example @@ -29,8 +29,16 @@ var config = { ,redis: { host: '127.0.0.1', port: 6333, - idleTimeoutMillis: 1, - reapIntervalMillis: 1 + // Max number of connections in each pool. + // Users will be put on a queue when the limit is hit. + // Set to maxConnection to have no possible queues. + // There are currently 3 pools involved in serving + // windshaft-cartodb requests so multiply this number + // by 3 to know how many possible connections will be + // kept open by the server. The default is 50. + max: 50, + idleTimeoutMillis: 1, // idle time before dropping connection + reapIntervalMillis: 1 // time between cleanups } ,sqlapi: { protocol: 'http', From 9b04abb36ca9478098baf6bccb5a28bdea3fe05b Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 22 Feb 2013 11:34:03 +0100 Subject: [PATCH 41/46] Add UTF grid checker function --- test/support/assert.js | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/support/assert.js b/test/support/assert.js index 82fcf99d..26d3221f 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -8,6 +8,64 @@ var exec = require('child_process').exec; var assert = module.exports = exports = require('assert'); +// @param tolerance number of tolerated grid cell differences +assert.utfgridEqualsFile = function(buffer, file_b, tolerance, callback) { + fs.writeFileSync('/tmp/grid.json', buffer, 'binary'); // <-- to debug/update + var expected_json = JSON.parse(fs.readFileSync(file_b, 'utf8')); + + var err = null; + + var Celldiff = function(x, y, ev, ov) { + this.x = x; + this.y = y; + this.ev = ev; + this.ov = ov; + }; + + Celldiff.prototype.toString = function() { + return '(' + this.x + ',' + this.y + ')["' + this.ev + '" != "' + this.ov + '"]'; + }; + + try { + var obtained_json = JSON.parse(buffer); + + // compare grid + var obtained_grid = obtained_json.grid; + var expected_grid = expected_json.grid; + var nrows = obtained_grid.length + if (nrows != expected_grid.length) { + throw new Error( "Obtained grid rows (" + nrows + + ") != expected grid rows (" + expected_grid.length + ")" ); + } + var celldiff = []; + for (var i=0; i tolerance ) { + throw new Error( celldiff.length + " cell differences: " + celldiff ); + } + + assert.deepEqual(obtained_json.keys, expected_json.keys); + } catch (e) { err = e; } + + callback(err); +}; + // // @param tol tolerated color distance as a percent over max channel value // by default this is zero. For meaningful values, see From f076b0c4d19d4cfa65bfd806b1542b20f9485401 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 25 Feb 2013 15:08:28 +0100 Subject: [PATCH 42/46] Require windshaft-0.9 for multilayer support --- NEWS.md | 1 + npm-shrinkwrap.json | 192 +++++++++++++++++++++++++++++----- package.json | 6 +- test/acceptance/multilayer.js | 148 ++++++++++++++++++++++++++ 4 files changed, 318 insertions(+), 29 deletions(-) create mode 100644 test/acceptance/multilayer.js diff --git a/NEWS.md b/NEWS.md index 78405632..28a9c773 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,7 @@ 1.1.7 (DD//MM//YY) ----- * Do not let /etc/services confuse FD checker (munin plugin) +* Multilayer support (#72) 1.1.6 (19//02//13) ----- diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 6769eeca..8c4c348c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "windshaft-cartodb", - "version": "1.1.6", + "version": "1.1.7", "dependencies": { "cluster2": { "version": "0.3.5-cdb02", @@ -32,10 +32,10 @@ "version": "0.8.3" }, "npm": { - "version": "1.1.69", + "version": "1.1.65", "dependencies": { "semver": { - "version": "1.1.1" + "version": "1.1.0" }, "ini": { "version": "1.0.5" @@ -50,12 +50,7 @@ "version": "1.1.14" }, "minimatch": { - "version": "0.2.9", - "dependencies": { - "sigmund": { - "version": "1.0.0" - } - } + "version": "0.2.8" }, "nopt": { "version": "2.0.0" @@ -71,7 +66,7 @@ "version": "1.0.5" }, "tar": { - "version": "0.1.14" + "version": "0.1.13" }, "fstream": { "version": "0.1.19" @@ -98,7 +93,7 @@ "version": "2.0.4" }, "node-gyp": { - "version": "0.7.3" + "version": "0.7.1" }, "fstream-npm": { "version": "0.1.3", @@ -132,7 +127,7 @@ } }, "read-package-json": { - "version": "0.1.11" + "version": "0.1.8" }, "read-installed": { "version": "0.0.3" @@ -164,7 +159,7 @@ "version": "0.0.16", "dependencies": { "config-chain": { - "version": "1.1.3", + "version": "1.1.2", "dependencies": { "proto-list": { "version": "1.2.2" @@ -187,8 +182,20 @@ "version": "1.3.3" }, "grainstore": { - "version": "0.10.10", + "version": "0.11.1", "dependencies": { + "underscore": { + "version": "1.3.3" + }, + "step": { + "version": "0.0.5" + }, + "semver": { + "version": "1.1.2" + }, + "generic-pool": { + "version": "1.0.12" + }, "carto": { "version": "0.9.3-cdb2", "from": "git://github.com/CartoDB/carto.git#cdb-0.9", @@ -197,18 +204,23 @@ "version": "0.1.14", "dependencies": { "sax": { - "version": "0.4.2" + "version": "0.5.1" } } } } }, "mapnik-reference": { - "version": "5.0.0-cdb1", - "from": "git://github.com/CartoDB/mapnik-reference.git#cdb-5.0" + "version": "5.0.4" + }, + "redis": { + "version": "0.7.3" + }, + "hiredis": { + "version": "0.1.14" }, "millstone": { - "version": "0.5.13", + "version": "0.5.15", "dependencies": { "request": { "version": "2.11.4", @@ -235,27 +247,61 @@ } }, "srs": { - "version": "0.2.18" + "version": "0.2.20" }, "zipfile": { - "version": "0.3.3" + "version": "0.3.4" }, "sqlite3": { "version": "2.1.5" }, "mime": { - "version": "1.2.7" + "version": "1.2.9" }, "mkdirp": { "version": "0.3.4" } } + }, + "libxmljs": { + "version": "0.5.4" + }, + "mocha": { + "version": "1.2.1", + "dependencies": { + "commander": { + "version": "0.6.1" + }, + "growl": { + "version": "1.5.1" + }, + "jade": { + "version": "0.26.3", + "dependencies": { + "mkdirp": { + "version": "0.3.0" + } + } + }, + "diff": { + "version": "1.0.2" + }, + "debug": { + "version": "0.7.0" + } + } } } }, "windshaft": { - "version": "0.8.5", + "version": "0.9.0", "dependencies": { + "underscore": { + "version": "1.3.3" + }, + "step": { + "version": "0.0.5" + }, "express": { "version": "2.5.11", "dependencies": { @@ -279,10 +325,10 @@ } }, "tilelive": { - "version": "4.3.3", + "version": "4.3.1", "dependencies": { "optimist": { - "version": "0.3.5", + "version": "0.3.4", "dependencies": { "wordwrap": { "version": "0.0.2" @@ -296,13 +342,58 @@ }, "tilelive-mapnik": { "version": "0.3.3-cdb2", - "from": "git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a", "dependencies": { + "step": { + "version": "0.0.5" + }, + "underscore": { + "version": "1.3.3" + }, + "generic-pool": { + "version": "1.0.12" + }, "eio": { "version": "0.1.0" }, "sphericalmercator": { "version": "1.0.2" + }, + "expresso": { + "version": "0.9.2" + } + } + }, + "redis": { + "version": "0.7.2" + }, + "hiredis": { + "version": "0.1.14" + }, + "semver": { + "version": "1.1.0" + }, + "mocha": { + "version": "1.2.1", + "dependencies": { + "commander": { + "version": "0.6.1" + }, + "growl": { + "version": "1.5.1" + }, + "jade": { + "version": "0.26.3", + "dependencies": { + "mkdirp": { + "version": "0.3.0" + } + } + }, + "diff": { + "version": "1.0.2" + }, + "debug": { + "version": "0.7.0" } } } @@ -324,7 +415,56 @@ "version": "2.9.202" }, "mapnik": { - "version": "0.7.18" + "version": "0.7.22", + "dependencies": { + "mocha": { + "version": "1.6.0", + "dependencies": { + "commander": { + "version": "0.6.1" + }, + "growl": { + "version": "1.5.1" + }, + "jade": { + "version": "0.26.3", + "dependencies": { + "mkdirp": { + "version": "0.3.0" + } + } + }, + "diff": { + "version": "1.0.2" + }, + "debug": { + "version": "0.7.0" + }, + "mkdirp": { + "version": "0.3.3" + }, + "ms": { + "version": "0.3.0" + } + } + }, + "jshint": { + "version": "0.5.9", + "dependencies": { + "argsparser": { + "version": "0.0.6" + }, + "minimatch": { + "version": "0.2.7", + "dependencies": { + "lru-cache": { + "version": "2.0.4" + } + } + } + } + } + } }, "semver": { "version": "1.1.1" diff --git a/package.json b/package.json index 52225ca9..4d657428 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,10 @@ "cluster2": "git://github.com/CartoDB/cluster2.git#cdb_production", "node-varnish": "0.1.1", "underscore" : "~1.3.3", - "grainstore" : "~0.10.10", - "windshaft" : "~0.8.4", + "grainstore" : "~0.11.1", + "windshaft" : "~0.9.0", "step": "0.0.x", - "generic-pool": "1.0.x", + "generic-pool": "~1.0.12", "redis": "0.7.2", "hiredis": "~0.1.14", "request": "2.9.202", diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js new file mode 100644 index 00000000..91e37b34 --- /dev/null +++ b/test/acceptance/multilayer.js @@ -0,0 +1,148 @@ +var assert = require('../support/assert'); +var tests = module.exports = {}; +var _ = require('underscore'); +var redis = require('redis'); +var querystring = require('querystring'); +var semver = require('semver'); +var mapnik = require('mapnik'); +var Step = require('step'); + +require(__dirname + '/../support/test_helper'); + +var windshaft_fixtures = __dirname + '/../../node_modules/windshaft/test/fixtures'; + +var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/cartodb_windshaft'); +var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); +var server = new CartodbWindshaft(serverOptions); +server.setMaxListeners(0); + +suite('multilayer', function() { + + var redis_client = redis.createClient(global.environment.redis.port); + + suiteSetup(function(){ + }); + + test("layergroup with 2 layers, each with its style", function(done) { + + var layergroup = { + version: '1.0.0', + layers: [ + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, 5e6, 0) as the_geom_webmercator from test_table limit 2', + cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }', + cartocss_version: '2.0.1' + } }, + { options: { + sql: 'select cartodb_id, ST_Translate(the_geom_webmercator, -5e6, 0) as the_geom_webmercator from test_table limit 2 offset 2', + cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }', + cartocss_version: '2.0.2' + } } + ] + }; + + var expected_token = "d442ca6d3ece793b9c16c02a1d1ea5f2"; + Step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/tiles/layergroup', + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + var expectedBody = { layergroupid: expected_token }; + // TODO: check last modified + //expectedBody.layercount = 2; + if ( expected_token ) assert.deepEqual(parsedBody, expectedBody); + else expected_token = parsedBody.layergroupid; + next(null, res); + }); + }, + function do_get_tile(err) + { + if ( err ) throw err; + var next = this; + assert.response(server, { + url: '/tiles/layergroup/' + expected_token + '/0/0/0.png', + method: 'GET', + headers: {host: 'localhost' }, + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + assert.imageEqualsFile(res.body, 'test/fixtures/test_table_0_0_0_multilayer1.png', 2, + function(err, similarity) { + next(err); + }); + }); + }, + function do_get_grid_layer0(err) + { + if ( err ) throw err; + var next = this; + assert.response(server, { + url: '/tiles/layergroup/' + expected_token + + '/layer0/0/0/0.grid.json?interactivity=cartodb_id', + headers: {host: 'localhost' }, + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "text/javascript; charset=utf-8; charset=utf-8"); + assert.utfgridEqualsFile(res.body, 'test/fixtures/test_table_0_0_0_multilayer1.layer0.grid.json', 2, + function(err, similarity) { + next(err); + }); + }); + }, + function do_get_grid_layer1(err) + { + if ( err ) throw err; + var next = this; + assert.response(server, { + url: '/tiles/layergroup/' + expected_token + + '/layer1/0/0/0.grid.json?interactivity=cartodb_id', + headers: {host: 'localhost' }, + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "text/javascript; charset=utf-8; charset=utf-8"); + assert.utfgridEqualsFile(res.body, 'test/fixtures/test_table_0_0_0_multilayer1.layer1.grid.json', 2, + function(err, similarity) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + console.log("Error: " + err); + } + redis_client.keys("map_style|cartodb_test_user_1_db|~" + expected_token, function(err, matches) { + if ( err ) errors.push(err.message); + assert.equal(matches.length, 1, "Missing expected token " + expected_token + " from redis: " + matches); + redis_client.del(matches, function(err) { + if ( err ) errors.push(err.message); + if ( errors.length ) done(new Error(errors)); + else done(null); + }); + }); + } + ); + }); + + suiteTeardown(function(done) { + // This test will add map_style records, like + // 'map_style|null|publicuser|my_table', + redis_client.keys("map_style|*", function(err, matches) { + _.each(matches, function(k) { redis_client.del(k); }); + done(); + }); + }); + +}); + From f6d50fafb14ecc5a73f1922a96f5db5355c9a841 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 25 Feb 2013 16:53:57 +0100 Subject: [PATCH 43/46] Expose renderer settings in the environment config files These are: metatile, bufferSize and cache_ttl --- NEWS.md | 1 + config/environments/development.js.example | 6 ++++++ config/environments/production.js.example | 6 ++++++ config/environments/staging.js.example | 6 ++++++ config/environments/test.js.example | 6 ++++++ lib/cartodb/server_options.js | 14 ++++++++++++++ 6 files changed, 39 insertions(+) diff --git a/NEWS.md b/NEWS.md index 28a9c773..066bd6f1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ ----- * Do not let /etc/services confuse FD checker (munin plugin) * Multilayer support (#72) +* Expose renderer settings in the environment config files 1.1.6 (19//02//13) ----- diff --git a/config/environments/development.js.example b/config/environments/development.js.example index 1d97b1dd..9c8c10f8 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -29,6 +29,12 @@ var config = { max_size: 500 } ,mapnik_version: undefined + ,renderer: { + // Milliseconds since last access before renderer cache item expires + cache_ttl: 60000, + metatile: 4, + bufferSize: 64 + } ,millstone: { cache_basedir: '/tmp/cdb-tiler-dev/millstone-dev' } diff --git a/config/environments/production.js.example b/config/environments/production.js.example index 42a9dd3e..5ee29407 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -23,6 +23,12 @@ var config = { max_size: 500 } ,mapnik_version: undefined + ,renderer: { + // Milliseconds since last access before renderer cache item expires + cache_ttl: 60000, + metatile: 4, + bufferSize: 64 + } ,millstone: { cache_basedir: '/home/ubuntu/tile_assets/' } diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index cd89f527..7fc660c5 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -23,6 +23,12 @@ var config = { max_size: 500 } ,mapnik_version: undefined + ,renderer: { + // Milliseconds since last access before renderer cache item expires + cache_ttl: 60000, + metatile: 4, + bufferSize: 64 + } ,millstone: { cache_basedir: '/home/ubuntu/tile_assets/' } diff --git a/config/environments/test.js.example b/config/environments/test.js.example index e7221704..b97b9a6d 100644 --- a/config/environments/test.js.example +++ b/config/environments/test.js.example @@ -23,6 +23,12 @@ var config = { max_size: 500 } ,mapnik_version: '2.0.2' + ,renderer: { + // Milliseconds since last access before renderer cache item expires + cache_ttl: 60000, + metatile: 4, + bufferSize: 64 + } ,millstone: { cache_basedir: '/tmp/cdb-tiler-test/millstone' } diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index 4fc5123f..ac9c458f 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -6,6 +6,13 @@ var _ = require('underscore') ; module.exports = function(){ + + var rendererConfig = _.defaults(global.environment.renderer || {}, { + cache_ttl: 60000, + metatile: 4, + bufferSize: 64 + }); + var me = { base_url: '/tiles/:table', base_url_notable: '/tiles', @@ -14,6 +21,13 @@ module.exports = function(){ cachedir: global.environment.millstone.cache_basedir, mapnik_version: global.environment.mapnik_version || mapnik.versions.mapnik }, + mapnik: { + metatile: rendererConfig.metatile, + bufferSize: rendererConfig.bufferSize + }, + renderCache: { + ttl: rendererConfig.cache_ttl + }, redis: global.environment.redis, enable_cors: global.environment.enable_cors, varnish_host: global.environment.varnish.host, From a7afdac67e2c2996554aa907541ef8e6c936fceb Mon Sep 17 00:00:00 2001 From: Luis Bosque Date: Thu, 28 Feb 2013 15:09:54 +0100 Subject: [PATCH 44/46] Target v1.1.8 --- NEWS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS.md b/NEWS.md index 066bd6f1..4d5214d8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +1.1.8 +----- + 1.1.7 (DD//MM//YY) ----- * Do not let /etc/services confuse FD checker (munin plugin) From 2fa09aee88f95d47bfaaa1a5eb2457730bee168f Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 1 Mar 2013 13:10:12 +0100 Subject: [PATCH 45/46] Require Windshaft-0.9.1, to reduce harmfulness of cache_buster param --- NEWS.md | 1 + npm-shrinkwrap.json | 215 ++++++++------------------------------------ package.json | 2 +- 3 files changed, 41 insertions(+), 177 deletions(-) diff --git a/NEWS.md b/NEWS.md index 4d5214d8..57db4db3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ 1.1.8 ----- +* Require Windshaft-0.9.1, to reduce harmfulness of cache_buster param 1.1.7 (DD//MM//YY) ----- diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 8c4c348c..3ef03a44 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -13,7 +13,7 @@ "version": "1.9.2", "dependencies": { "formidable": { - "version": "1.0.11" + "version": "1.0.12" } } }, @@ -32,31 +32,36 @@ "version": "0.8.3" }, "npm": { - "version": "1.1.65", + "version": "1.2.12", "dependencies": { "semver": { - "version": "1.1.0" + "version": "1.1.3" }, "ini": { - "version": "1.0.5" + "version": "1.1.0" }, "slide": { "version": "1.1.3" }, "abbrev": { - "version": "1.0.3" + "version": "1.0.4" }, "graceful-fs": { - "version": "1.1.14" + "version": "1.2.0" }, "minimatch": { - "version": "0.2.8" + "version": "0.2.9", + "dependencies": { + "sigmund": { + "version": "1.0.0" + } + } }, "nopt": { - "version": "2.0.0" + "version": "2.1.1" }, "rimraf": { - "version": "2.0.2" + "version": "2.1.4" }, "request": { "version": "2.9.203", @@ -66,10 +71,10 @@ "version": "1.0.5" }, "tar": { - "version": "0.1.13" + "version": "0.1.16" }, "fstream": { - "version": "0.1.19" + "version": "0.1.22" }, "block-stream": { "version": "0.0.6" @@ -93,13 +98,13 @@ "version": "2.0.4" }, "node-gyp": { - "version": "0.7.1" + "version": "0.8.4" }, "fstream-npm": { "version": "0.1.3", "dependencies": { "fstream-ignore": { - "version": "0.0.5" + "version": "0.0.6" } } }, @@ -119,7 +124,7 @@ "version": "0.1.2" }, "npm-registry-client": { - "version": "0.2.10", + "version": "0.2.17", "dependencies": { "couch-login": { "version": "0.1.15" @@ -127,13 +132,13 @@ } }, "read-package-json": { - "version": "0.1.8" + "version": "0.2.0" }, "read-installed": { - "version": "0.0.3" + "version": "0.1.1" }, "glob": { - "version": "3.1.14" + "version": "3.1.20" }, "init-package-json": { "version": "0.0.6", @@ -147,7 +152,7 @@ "version": "0.0.3" }, "lockfile": { - "version": "0.2.1" + "version": "0.3.0" }, "retry": { "version": "0.6.0" @@ -156,10 +161,10 @@ "version": "1.1.1" }, "npmconf": { - "version": "0.0.16", + "version": "0.0.23", "dependencies": { "config-chain": { - "version": "1.1.2", + "version": "1.1.5", "dependencies": { "proto-list": { "version": "1.2.2" @@ -184,27 +189,19 @@ "grainstore": { "version": "0.11.1", "dependencies": { - "underscore": { - "version": "1.3.3" - }, - "step": { - "version": "0.0.5" - }, - "semver": { - "version": "1.1.2" - }, - "generic-pool": { - "version": "1.0.12" - }, "carto": { "version": "0.9.3-cdb2", "from": "git://github.com/CartoDB/carto.git#cdb-0.9", "dependencies": { + "mapnik-reference": { + "version": "5.0.0-cdb1", + "from": "git://github.com/CartoDB/mapnik-reference.git#cdb-5.0" + }, "xml2js": { "version": "0.1.14", "dependencies": { "sax": { - "version": "0.5.1" + "version": "0.5.2" } } } @@ -213,12 +210,6 @@ "mapnik-reference": { "version": "5.0.4" }, - "redis": { - "version": "0.7.3" - }, - "hiredis": { - "version": "0.1.14" - }, "millstone": { "version": "0.5.15", "dependencies": { @@ -259,49 +250,15 @@ "version": "1.2.9" }, "mkdirp": { - "version": "0.3.4" - } - } - }, - "libxmljs": { - "version": "0.5.4" - }, - "mocha": { - "version": "1.2.1", - "dependencies": { - "commander": { - "version": "0.6.1" - }, - "growl": { - "version": "1.5.1" - }, - "jade": { - "version": "0.26.3", - "dependencies": { - "mkdirp": { - "version": "0.3.0" - } - } - }, - "diff": { - "version": "1.0.2" - }, - "debug": { - "version": "0.7.0" + "version": "0.3.5" } } } } }, "windshaft": { - "version": "0.9.0", + "version": "0.9.1", "dependencies": { - "underscore": { - "version": "1.3.3" - }, - "step": { - "version": "0.0.5" - }, "express": { "version": "2.5.11", "dependencies": { @@ -309,7 +266,7 @@ "version": "1.9.2", "dependencies": { "formidable": { - "version": "1.0.11" + "version": "1.0.12" } } }, @@ -325,10 +282,10 @@ } }, "tilelive": { - "version": "4.3.1", + "version": "4.3.3", "dependencies": { "optimist": { - "version": "0.3.4", + "version": "0.3.5", "dependencies": { "wordwrap": { "version": "0.0.2" @@ -342,58 +299,13 @@ }, "tilelive-mapnik": { "version": "0.3.3-cdb2", + "from": "git://github.com/Vizzuality/tilelive-mapnik.git#6061c65a", "dependencies": { - "step": { - "version": "0.0.5" - }, - "underscore": { - "version": "1.3.3" - }, - "generic-pool": { - "version": "1.0.12" - }, "eio": { "version": "0.1.0" }, "sphericalmercator": { "version": "1.0.2" - }, - "expresso": { - "version": "0.9.2" - } - } - }, - "redis": { - "version": "0.7.2" - }, - "hiredis": { - "version": "0.1.14" - }, - "semver": { - "version": "1.1.0" - }, - "mocha": { - "version": "1.2.1", - "dependencies": { - "commander": { - "version": "0.6.1" - }, - "growl": { - "version": "1.5.1" - }, - "jade": { - "version": "0.26.3", - "dependencies": { - "mkdirp": { - "version": "0.3.0" - } - } - }, - "diff": { - "version": "1.0.2" - }, - "debug": { - "version": "0.7.0" } } } @@ -415,59 +327,10 @@ "version": "2.9.202" }, "mapnik": { - "version": "0.7.22", - "dependencies": { - "mocha": { - "version": "1.6.0", - "dependencies": { - "commander": { - "version": "0.6.1" - }, - "growl": { - "version": "1.5.1" - }, - "jade": { - "version": "0.26.3", - "dependencies": { - "mkdirp": { - "version": "0.3.0" - } - } - }, - "diff": { - "version": "1.0.2" - }, - "debug": { - "version": "0.7.0" - }, - "mkdirp": { - "version": "0.3.3" - }, - "ms": { - "version": "0.3.0" - } - } - }, - "jshint": { - "version": "0.5.9", - "dependencies": { - "argsparser": { - "version": "0.0.6" - }, - "minimatch": { - "version": "0.2.7", - "dependencies": { - "lru-cache": { - "version": "2.0.4" - } - } - } - } - } - } + "version": "0.7.22" }, "semver": { - "version": "1.1.1" + "version": "1.1.3" }, "mocha": { "version": "1.2.1", @@ -490,7 +353,7 @@ "version": "1.0.2" }, "debug": { - "version": "0.7.0" + "version": "0.7.2" } } } diff --git a/package.json b/package.json index 4d657428..7400f21b 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "node-varnish": "0.1.1", "underscore" : "~1.3.3", "grainstore" : "~0.11.1", - "windshaft" : "~0.9.0", + "windshaft" : "~0.9.1", "step": "0.0.x", "generic-pool": "~1.0.12", "redis": "0.7.2", From e038aa75222dd5eff2469de15b1cb735dc3bdd66 Mon Sep 17 00:00:00 2001 From: Luis Bosque Date: Mon, 4 Mar 2013 11:38:43 +0100 Subject: [PATCH 46/46] V1.1.8 in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7400f21b..fab65f18 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "1.1.7", + "version": "1.1.8", "description": "A map tile server for CartoDB", "url": "https://github.com/Vizzuality/Windshaft-cartodb", "licenses": [{