From 20d1db78dc04775658bf301172cea1a5ed8d3d8f Mon Sep 17 00:00:00 2001 From: Rafa de la Torre Date: Thu, 19 Jul 2018 17:30:05 +0200 Subject: [PATCH] Helper to reset pgbouncer connections #521 This sends a PAUSE and RESUME to pgbouncer (in case there's one) before and after executing tests, to make sure new connections are established in the tests. This may be especially important when role or session settings are modified in the DB (same happens in prod, BTW). --- test/acceptance/batch/batch-limits.test.js | 4 ++- test/acceptance/export/timeout.js | 4 +++ test/support/db_utils.js | 37 ++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 test/support/db_utils.js diff --git a/test/acceptance/batch/batch-limits.test.js b/test/acceptance/batch/batch-limits.test.js index f015787e..5d46872c 100644 --- a/test/acceptance/batch/batch-limits.test.js +++ b/test/acceptance/batch/batch-limits.test.js @@ -5,6 +5,7 @@ var BatchTestClient = require('../../support/batch-test-client'); var JobStatus = require('../../../batch/job_status'); var redisUtils = require('../../support/redis_utils'); var metadataBackend = require('cartodb-redis')({ pool: redisUtils.getPool() }); +const db_utils = require('../../support/db_utils'); describe('batch query statement_timeout limit', function() { @@ -14,13 +15,14 @@ describe('batch query statement_timeout limit', function() { global.settings.batch_query_timeout = 15000; metadataBackend.redisCmd(5, 'HMSET', ['limits:batch:vizzuality', 'timeout', 100], done); }); - + before(db_utils.resetPgBouncerConnections); after(function(done) { global.settings.batch_query_timeout = this.batchQueryTimeout; redisUtils.clean('limits:batch:*', function() { this.batchTestClient.drain(done); }.bind(this)); }); + after(db_utils.resetPgBouncerConnections); function jobPayload(query) { return { diff --git a/test/acceptance/export/timeout.js b/test/acceptance/export/timeout.js index 0a927acc..2cc5a558 100644 --- a/test/acceptance/export/timeout.js +++ b/test/acceptance/export/timeout.js @@ -4,9 +4,13 @@ require('../../support/assert'); var assert = require('assert'); var querystring = require('querystring'); +const db_utils = require('../../support/db_utils'); describe('timeout', function () { describe('export database', function () { + before(db_utils.resetPgBouncerConnections); + after(db_utils.resetPgBouncerConnections); + const databaseTimeoutQuery = ` select ST_SetSRID(ST_Point(0, 0), 4326) as the_geom, diff --git a/test/support/db_utils.js b/test/support/db_utils.js new file mode 100644 index 00000000..e747a7f1 --- /dev/null +++ b/test/support/db_utils.js @@ -0,0 +1,37 @@ +'use strict'; + +const { Client } = require('pg'); + +const dbConfig = { + db_user: process.env.PGUSER || 'postgres', + db_host: global.settings.db_host, + db_port: global.settings.db_port, + db_batch_port: global.settings.db_batch_port +}; + +module.exports.resetPgBouncerConnections = function (callback) { + // We assume there's no pgbouncer if db_port === db_batch_port + if (dbConfig.db_port === dbConfig.db_batch_port) { + return callback(); + } + + const client = new Client({ + database: 'pgbouncer', + user: dbConfig.db_user, + host: dbConfig.db_host, + port: dbConfig.db_port + }); + + // We just chain a PAUSE followed by a RESUME + client.connect(); + client.query('PAUSE', (err, res) => { + if (err) { + return callback(err); + } else { + client.query('RESUME', (err, res) => { + client.end(); + return callback(err); + }); + } + }); +}