Skip to content

Commit 6b39253

Browse files
authored
Merge pull request #2049 from aheuermann/idle_in_transaction_session_timeout
Adding ability to pass through idle_in_transaction_session_tim…
2 parents af4d054 + 6ddbe6a commit 6b39253

File tree

5 files changed

+94
-3
lines changed

5 files changed

+94
-3
lines changed

packages/pg/lib/client.js

+3
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,9 @@ Client.prototype.getStartupConf = function () {
371371
if (params.statement_timeout) {
372372
data.statement_timeout = String(parseInt(params.statement_timeout, 10))
373373
}
374+
if (params.idle_in_transaction_session_timeout) {
375+
data.idle_in_transaction_session_timeout = String(parseInt(params.idle_in_transaction_session_timeout, 10))
376+
}
374377

375378
return data
376379
}

packages/pg/lib/connection-parameters.js

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ var ConnectionParameters = function (config) {
6565
this.application_name = val('application_name', config, 'PGAPPNAME')
6666
this.fallback_application_name = val('fallback_application_name', config, false)
6767
this.statement_timeout = val('statement_timeout', config, false)
68+
this.idle_in_transaction_session_timeout = val('idle_in_transaction_session_timeout', config, false)
6869
this.query_timeout = val('query_timeout', config, false)
6970

7071
if (config.connectionTimeoutMillis === undefined) {

packages/pg/lib/defaults.js

+4
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ module.exports = {
5959
// false=unlimited
6060
statement_timeout: false,
6161

62+
// Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds
63+
// false=unlimited
64+
idle_in_transaction_session_timeout: false,
65+
6266
// max milliseconds to wait for query to complete (client side)
6367
query_timeout: false,
6468

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
'use strict'
2+
var helper = require('./test-helper')
3+
var Client = helper.Client
4+
5+
var suite = new helper.Suite()
6+
7+
var conInfo = helper.config
8+
9+
function getConInfo (override) {
10+
return Object.assign({}, conInfo, override )
11+
}
12+
13+
function testClientVersion(cb) {
14+
var client = new Client({})
15+
client.connect(assert.success(function () {
16+
helper.versionGTE(client, 100000, assert.success(function(isGreater) {
17+
return client.end(assert.success(function () {
18+
if (!isGreater) {
19+
console.log('skip idle_in_transaction_session_timeout at client-level is only available in v10 and above');
20+
return;
21+
}
22+
cb();
23+
}))
24+
}))
25+
}))
26+
}
27+
28+
function getIdleTransactionSessionTimeout (conf, cb) {
29+
var client = new Client(conf)
30+
client.connect(assert.success(function () {
31+
client.query('SHOW idle_in_transaction_session_timeout', assert.success(function (res) {
32+
var timeout = res.rows[0].idle_in_transaction_session_timeout
33+
cb(timeout)
34+
client.end()
35+
}))
36+
}))
37+
}
38+
39+
if (!helper.args.native) { // idle_in_transaction_session_timeout is not supported with the native client
40+
testClientVersion(function(){
41+
suite.test('No default idle_in_transaction_session_timeout ', function (done) {
42+
getConInfo()
43+
getIdleTransactionSessionTimeout({}, function (res) {
44+
assert.strictEqual(res, '0') // 0 = no timeout
45+
done()
46+
})
47+
})
48+
49+
suite.test('idle_in_transaction_session_timeout integer is used', function (done) {
50+
var conf = getConInfo({
51+
'idle_in_transaction_session_timeout': 3000
52+
})
53+
getIdleTransactionSessionTimeout(conf, function (res) {
54+
assert.strictEqual(res, '3s')
55+
done()
56+
})
57+
})
58+
59+
suite.test('idle_in_transaction_session_timeout float is used', function (done) {
60+
var conf = getConInfo({
61+
'idle_in_transaction_session_timeout': 3000.7
62+
})
63+
getIdleTransactionSessionTimeout(conf, function (res) {
64+
assert.strictEqual(res, '3s')
65+
done()
66+
})
67+
})
68+
69+
suite.test('idle_in_transaction_session_timeout string is used', function (done) {
70+
var conf = getConInfo({
71+
'idle_in_transaction_session_timeout': '3000'
72+
})
73+
getIdleTransactionSessionTimeout(conf, function (res) {
74+
assert.strictEqual(res, '3s')
75+
done()
76+
})
77+
})
78+
})
79+
}

packages/pg/test/unit/connection-parameters/creation-tests.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ var compare = function (actual, expected, type) {
2222
assert.equal(actual.host, expected.host, type + ' host')
2323
assert.equal(actual.password, expected.password, type + ' password')
2424
assert.equal(actual.binary, expected.binary, type + ' binary')
25-
assert.equal(actual.statement_timout, expected.statement_timout, type + ' statement_timeout')
25+
assert.equal(actual.statement_timeout, expected.statement_timeout, type + ' statement_timeout')
26+
assert.equal(actual.idle_in_transaction_session_timeout, expected.idle_in_transaction_session_timeout, type + ' idle_in_transaction_session_timeout')
2627
}
2728

2829
test('ConnectionParameters initializing from defaults', function () {
@@ -38,7 +39,9 @@ test('ConnectionParameters initializing from defaults with connectionString set'
3839
port: 7777,
3940
password: 'mypassword',
4041
host: 'foo.bar.net',
41-
binary: defaults.binary
42+
binary: defaults.binary,
43+
statement_timeout: false,
44+
idle_in_transaction_session_timeout: false,
4245
}
4346

4447
var original_value = defaults.connectionString
@@ -62,7 +65,8 @@ test('ConnectionParameters initializing from config', function () {
6265
ssl: {
6366
asdf: 'blah'
6467
},
65-
statement_timeout: 15000
68+
statement_timeout: 15000,
69+
idle_in_transaction_session_timeout: 15000
6670
}
6771
var subject = new ConnectionParameters(config)
6872
compare(subject, config, 'config')

0 commit comments

Comments
 (0)