From bb8e806bc53e179cd19f3461669d891dd0358b74 Mon Sep 17 00:00:00 2001 From: Andrew Heuermann Date: Fri, 27 Dec 2019 15:09:58 -0600 Subject: [PATCH 1/4] Adding ability to pass through idle_in_transaction_session_timeout --- packages/pg/lib/client.js | 3 + packages/pg/lib/connection-parameters.js | 1 + packages/pg/lib/defaults.js | 4 ++ ...le_in_transaction_session_timeout-tests.js | 63 +++++++++++++++++++ .../connection-parameters/creation-tests.js | 4 +- 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js diff --git a/packages/pg/lib/client.js b/packages/pg/lib/client.js index 077a9f676..93807e48c 100644 --- a/packages/pg/lib/client.js +++ b/packages/pg/lib/client.js @@ -371,6 +371,9 @@ Client.prototype.getStartupConf = function () { if (params.statement_timeout) { data.statement_timeout = String(parseInt(params.statement_timeout, 10)) } + if (params.idle_in_transaction_session_timeout) { + data.idle_in_transaction_session_timeout = String(parseInt(params.idle_in_transaction_session_timeout, 10)) + } return data } diff --git a/packages/pg/lib/connection-parameters.js b/packages/pg/lib/connection-parameters.js index 00ea76111..0d5e0376d 100644 --- a/packages/pg/lib/connection-parameters.js +++ b/packages/pg/lib/connection-parameters.js @@ -65,6 +65,7 @@ var ConnectionParameters = function (config) { this.application_name = val('application_name', config, 'PGAPPNAME') this.fallback_application_name = val('fallback_application_name', config, false) this.statement_timeout = val('statement_timeout', config, false) + this.idle_in_transaction_session_timeout = val('idle_in_transaction_session_timeout', config, false) this.query_timeout = val('query_timeout', config, false) if (config.connectionTimeoutMillis === undefined) { diff --git a/packages/pg/lib/defaults.js b/packages/pg/lib/defaults.js index bd1bf6de6..120b8c7b5 100644 --- a/packages/pg/lib/defaults.js +++ b/packages/pg/lib/defaults.js @@ -59,6 +59,10 @@ module.exports = { // false=unlimited statement_timeout: false, + // Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds + // false=unlimited + idle_in_transaction_session_timeout: false, + // max milliseconds to wait for query to complete (client side) query_timeout: false, diff --git a/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js new file mode 100644 index 000000000..b40a5ace6 --- /dev/null +++ b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js @@ -0,0 +1,63 @@ +'use strict' +var helper = require('./test-helper') +var Client = helper.Client + +var suite = new helper.Suite() + +var conInfo = helper.config + +function getConInfo (override) { + return Object.assign({}, conInfo, override ) +} + +function getIdleTransactionSessionTimeout (conf, cb) { + var client = new Client(conf) + client.connect(assert.success(function () { + client.query('SHOW idle_in_transaction_session_timeout', assert.success(function (res) { + var timeout = res.rows[0].idle_in_transaction_session_timeout + cb(timeout) + client.end() + })) + })) +} + +if (!helper.args.native) { // idle_in_transaction_session_timeout is not supported with the native client + suite.test('No default idle_in_transaction_session_timeout ', function (done) { + getConInfo() + getIdleTransactionSessionTimeout({}, function (res) { + assert.strictEqual(res, '0') // 0 = no timeout + done() + }) + }) + + suite.test('idle_in_transaction_session_timeout integer is used', function (done) { + var conf = getConInfo({ + 'idle_in_transaction_session_timeout': 3000 + }) + getIdleTransactionSessionTimeout(conf, function (res) { + assert.strictEqual(res, '3s') + done() + }) + }) + + suite.test('idle_in_transaction_session_timeout float is used', function (done) { + var conf = getConInfo({ + 'idle_in_transaction_session_timeout': 3000.7 + }) + getIdleTransactionSessionTimeout(conf, function (res) { + assert.strictEqual(res, '3s') + done() + }) + }) + + suite.test('idle_in_transaction_session_timeout string is used', function (done) { + var conf = getConInfo({ + 'idle_in_transaction_session_timeout': '3000' + }) + getIdleTransactionSessionTimeout(conf, function (res) { + assert.strictEqual(res, '3s') + done() + }) + }) + +} diff --git a/packages/pg/test/unit/connection-parameters/creation-tests.js b/packages/pg/test/unit/connection-parameters/creation-tests.js index fc9f6521f..bb0733d2c 100644 --- a/packages/pg/test/unit/connection-parameters/creation-tests.js +++ b/packages/pg/test/unit/connection-parameters/creation-tests.js @@ -23,6 +23,7 @@ var compare = function (actual, expected, type) { assert.equal(actual.password, expected.password, type + ' password') assert.equal(actual.binary, expected.binary, type + ' binary') assert.equal(actual.statement_timout, expected.statement_timout, type + ' statement_timeout') + assert.equal(actual.idle_in_transaction_session_timeout, expected.idle_in_transaction_session_timeout, type + 'idle_in_transaction_session_timeout') } test('ConnectionParameters initializing from defaults', function () { @@ -62,7 +63,8 @@ test('ConnectionParameters initializing from config', function () { ssl: { asdf: 'blah' }, - statement_timeout: 15000 + statement_timeout: 15000, + idle_in_transaction_session_timeout: 15000 } var subject = new ConnectionParameters(config) compare(subject, config, 'config') From 63637786753843a884aa741f904f46155c65d4ac Mon Sep 17 00:00:00 2001 From: Andrew Heuermann Date: Fri, 27 Dec 2019 15:36:41 -0600 Subject: [PATCH 2/4] Fixing test --- .../pg/test/unit/connection-parameters/creation-tests.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/pg/test/unit/connection-parameters/creation-tests.js b/packages/pg/test/unit/connection-parameters/creation-tests.js index bb0733d2c..5d200be0a 100644 --- a/packages/pg/test/unit/connection-parameters/creation-tests.js +++ b/packages/pg/test/unit/connection-parameters/creation-tests.js @@ -22,8 +22,8 @@ var compare = function (actual, expected, type) { assert.equal(actual.host, expected.host, type + ' host') assert.equal(actual.password, expected.password, type + ' password') assert.equal(actual.binary, expected.binary, type + ' binary') - assert.equal(actual.statement_timout, expected.statement_timout, type + ' statement_timeout') - assert.equal(actual.idle_in_transaction_session_timeout, expected.idle_in_transaction_session_timeout, type + 'idle_in_transaction_session_timeout') + assert.equal(actual.statement_timeout, expected.statement_timeout, type + ' statement_timeout') + assert.equal(actual.idle_in_transaction_session_timeout, expected.idle_in_transaction_session_timeout, type + ' idle_in_transaction_session_timeout') } test('ConnectionParameters initializing from defaults', function () { @@ -39,7 +39,9 @@ test('ConnectionParameters initializing from defaults with connectionString set' port: 7777, password: 'mypassword', host: 'foo.bar.net', - binary: defaults.binary + binary: defaults.binary, + statement_timeout: false, + idle_in_transaction_session_timeout: false, } var original_value = defaults.connectionString From 839043206de96fee710c55776a803895702dc299 Mon Sep 17 00:00:00 2001 From: Andrew Heuermann Date: Sat, 28 Dec 2019 09:01:35 -0600 Subject: [PATCH 3/4] Only run tests on >= v10 --- ...le_in_transaction_session_timeout-tests.js | 74 +++++++++++-------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js index b40a5ace6..4435a40b6 100644 --- a/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js +++ b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js @@ -10,6 +10,19 @@ function getConInfo (override) { return Object.assign({}, conInfo, override ) } +function testClientVersion(cb) { + var client = new Client({}) + client.connect(assert.success(function () { + helper.versionGTE(client, 100000, assert.success(function(isGreater) { + if (!isGreater) { + console.log('skip idle_in_transaction_session_timeout at client-level is only available in v10 and above'); + return client.end(); + } + cb(); + })) + })) +} + function getIdleTransactionSessionTimeout (conf, cb) { var client = new Client(conf) client.connect(assert.success(function () { @@ -22,42 +35,43 @@ function getIdleTransactionSessionTimeout (conf, cb) { } if (!helper.args.native) { // idle_in_transaction_session_timeout is not supported with the native client - suite.test('No default idle_in_transaction_session_timeout ', function (done) { - getConInfo() - getIdleTransactionSessionTimeout({}, function (res) { - assert.strictEqual(res, '0') // 0 = no timeout - done() + testClientVersion(function(){ + suite.test('No default idle_in_transaction_session_timeout ', function (done) { + getConInfo() + getIdleTransactionSessionTimeout({}, function (res) { + assert.strictEqual(res, '0') // 0 = no timeout + done() + }) }) - }) - suite.test('idle_in_transaction_session_timeout integer is used', function (done) { - var conf = getConInfo({ - 'idle_in_transaction_session_timeout': 3000 + suite.test('idle_in_transaction_session_timeout integer is used', function (done) { + var conf = getConInfo({ + 'idle_in_transaction_session_timeout': 3000 + }) + getIdleTransactionSessionTimeout(conf, function (res) { + assert.strictEqual(res, '3s') + done() + }) }) - getIdleTransactionSessionTimeout(conf, function (res) { - assert.strictEqual(res, '3s') - done() - }) - }) - suite.test('idle_in_transaction_session_timeout float is used', function (done) { - var conf = getConInfo({ - 'idle_in_transaction_session_timeout': 3000.7 - }) - getIdleTransactionSessionTimeout(conf, function (res) { - assert.strictEqual(res, '3s') - done() + suite.test('idle_in_transaction_session_timeout float is used', function (done) { + var conf = getConInfo({ + 'idle_in_transaction_session_timeout': 3000.7 + }) + getIdleTransactionSessionTimeout(conf, function (res) { + assert.strictEqual(res, '3s') + done() + }) }) - }) - suite.test('idle_in_transaction_session_timeout string is used', function (done) { - var conf = getConInfo({ - 'idle_in_transaction_session_timeout': '3000' - }) - getIdleTransactionSessionTimeout(conf, function (res) { - assert.strictEqual(res, '3s') - done() + suite.test('idle_in_transaction_session_timeout string is used', function (done) { + var conf = getConInfo({ + 'idle_in_transaction_session_timeout': '3000' + }) + getIdleTransactionSessionTimeout(conf, function (res) { + assert.strictEqual(res, '3s') + done() + }) }) }) - } From 6ddbe6ab60072d2e67ea5ab3a82fc7a0da72f5a2 Mon Sep 17 00:00:00 2001 From: Andrew Heuermann Date: Sat, 28 Dec 2019 09:24:45 -0600 Subject: [PATCH 4/4] Close connection after version check --- .../idle_in_transaction_session_timeout-tests.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js index 4435a40b6..18162f545 100644 --- a/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js +++ b/packages/pg/test/integration/client/idle_in_transaction_session_timeout-tests.js @@ -14,11 +14,13 @@ function testClientVersion(cb) { var client = new Client({}) client.connect(assert.success(function () { helper.versionGTE(client, 100000, assert.success(function(isGreater) { - if (!isGreater) { - console.log('skip idle_in_transaction_session_timeout at client-level is only available in v10 and above'); - return client.end(); - } - cb(); + return client.end(assert.success(function () { + if (!isGreater) { + console.log('skip idle_in_transaction_session_timeout at client-level is only available in v10 and above'); + return; + } + cb(); + })) })) })) }