From 1fdc0621e780348c902e01a620eab3b24ed06a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 31 Jul 2017 19:36:07 +0200 Subject: [PATCH] Categorize timeout errors --- lib/cartodb/controllers/base.js | 34 +++++++++++++++++++ .../acceptance/user-database-timeout-limit.js | 18 +++++++--- test/acceptance/user-render-timeout-limit.js | 27 ++++++++++++--- 3 files changed, 69 insertions(+), 10 deletions(-) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index c5afdecb..cdfc84ff 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -195,6 +195,9 @@ BaseController.prototype.send = function(req, res, body, status, headers) { BaseController.prototype.sendError = function(req, res, err, label) { var allErrors = Array.isArray(err) ? err : [err]; + + allErrors = populateTimeoutErrors(allErrors) + label = label || 'UNKNOWN'; err = allErrors[0] || new Error(label); allErrors[0] = err; @@ -310,3 +313,34 @@ function statusFromErrorMessage(errMsg) { return statusCode; } + +function isRenderTimeoutError (err) { + return err.message && (-1 !== err.message.indexOf('Render timed out')) +} + +function isDatasourceTimeoutError (err) { + return err.message && (-1 !== err.message.indexOf('canceling statement due to statement timeout')) +} + +function isTimeoutError (err) { + return isRenderTimeoutError(err) || isDatasourceTimeoutError(err); +} + +function populateTimeoutErrors (errors) { + return errors.map(function (error) { + if (isTimeoutError(error)) { + error.type = 'limit' + } + + if (isRenderTimeoutError(error)) { + error.subtype = 'render' + } + + if (isDatasourceTimeoutError(error)) { + + error.subtype = 'datasource' + } + + return error; + }) +} diff --git a/test/acceptance/user-database-timeout-limit.js b/test/acceptance/user-database-timeout-limit.js index 53b69775..241b900c 100644 --- a/test/acceptance/user-database-timeout-limit.js +++ b/test/acceptance/user-database-timeout-limit.js @@ -87,7 +87,11 @@ describe('user database timeout limit', function () { assert.deepEqual(dataview, { errors: ['canceling statement due to statement timeout'], - errors_with_context: [{ type: 'unknown', message: 'canceling statement due to statement timeout' }] + errors_with_context: [{ + type: 'limit', + subtype: 'datasource', + message: 'canceling statement due to statement timeout' + }] }); done(); @@ -127,7 +131,8 @@ describe('user database timeout limit', function () { assert.deepEqual(timeoutError, { errors: [ 'TorqueRenderer: canceling statement due to statement timeout' ], errors_with_context: [{ - type: 'layer', + type: 'limit', + subtype: 'datasource', message: 'TorqueRenderer: canceling statement due to statement timeout', layer: { id: 'torque-layer0', index: 0, type: 'torque' } }] @@ -195,7 +200,8 @@ describe('user database timeout limit', function () { assert.deepEqual(attributes, { errors: [ 'TorqueRenderer: canceling statement due to statement timeout' ], errors_with_context: [{ - type: 'unknown', + type: 'limit', + subtype: 'datasource', message: 'TorqueRenderer: canceling statement due to statement timeout', }] }); @@ -241,7 +247,8 @@ describe('user database timeout limit', function () { assert.deepEqual(timeoutError, { errors: [ 'canceling statement due to statement timeout' ], errors_with_context: [{ - type: 'layer', + type: 'limit', + subtype: 'datasource', message: 'canceling statement due to statement timeout', layer: { id: 'layer0', @@ -317,7 +324,8 @@ describe('user database timeout limit', function () { assert.deepEqual(attributes, { errors: ['canceling statement due to statement timeout'], errors_with_context: [{ - type: 'unknown', + type: 'limit', + subtype: 'datasource', message: 'canceling statement due to statement timeout' }] }); diff --git a/test/acceptance/user-render-timeout-limit.js b/test/acceptance/user-render-timeout-limit.js index e579a132..c5751bed 100644 --- a/test/acceptance/user-render-timeout-limit.js +++ b/test/acceptance/user-render-timeout-limit.js @@ -97,7 +97,8 @@ describe('user render timeout limit', function () { assert.deepEqual(timeoutError, { errors: ["Render timed out"], errors_with_context: [{ - type: "layer", + type: 'limit', + subtype: 'render', message: "Render timed out", layer: { id: "layer0", @@ -181,10 +182,18 @@ describe('user render timeout limit', function () { } }; - this.testClient.getTile(0, 0, 0, params, (err, res, tile) => { + this.testClient.getTile(0, 0, 0, params, (err, res, timeoutError) => { assert.ifError(err); - assert.equal(tile.errors[0], 'Render timed out'); + assert.deepEqual(timeoutError, { + errors: ["Render timed out"], + errors_with_context: [{ + type: 'limit', + subtype: 'render', + message: "Render timed out" + }] + }); + done(); }); }); @@ -223,7 +232,11 @@ describe('user render timeout limit', function () { assert.deepEqual(tile, { errors: ['Render timed out'], - errors_with_context: [{ type: 'unknown', message: 'Render timed out' }] + errors_with_context: [{ + type: 'limit', + subtype: 'render', + message: 'Render timed out' + }] }); done(); @@ -264,7 +277,11 @@ describe('user render timeout limit', function () { assert.deepEqual(tile, { errors: ['Render timed out'], - errors_with_context: [{ type: 'unknown', message: 'Render timed out' }] + errors_with_context: [{ + type: 'limit', + subtype: 'render', + message: 'Render timed out' + }] }); done();