Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2157 from chriskchew/ckc/maxuses2
Add maxUses config option to Pool
- Loading branch information
Showing
4 changed files
with
126 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
const expect = require('expect.js') | ||
const co = require('co') | ||
const _ = require('lodash') | ||
|
||
const describe = require('mocha').describe | ||
const it = require('mocha').it | ||
|
||
const Pool = require('../') | ||
|
||
describe('maxUses', () => { | ||
it('can create a single client and use it once', co.wrap(function * () { | ||
const pool = new Pool({ maxUses: 2 }) | ||
expect(pool.waitingCount).to.equal(0) | ||
const client = yield pool.connect() | ||
const res = yield client.query('SELECT $1::text as name', ['hi']) | ||
expect(res.rows[0].name).to.equal('hi') | ||
client.release() | ||
pool.end() | ||
})) | ||
|
||
it('getting a connection a second time returns the same connection and releasing it also closes it', co.wrap(function * () { | ||
const pool = new Pool({ maxUses: 2 }) | ||
expect(pool.waitingCount).to.equal(0) | ||
const client = yield pool.connect() | ||
client.release() | ||
const client2 = yield pool.connect() | ||
expect(client).to.equal(client2) | ||
expect(client2._ending).to.equal(false) | ||
client2.release() | ||
expect(client2._ending).to.equal(true) | ||
return yield pool.end() | ||
})) | ||
|
||
it('getting a connection a third time returns a new connection', co.wrap(function * () { | ||
const pool = new Pool({ maxUses: 2 }) | ||
expect(pool.waitingCount).to.equal(0) | ||
const client = yield pool.connect() | ||
client.release() | ||
const client2 = yield pool.connect() | ||
expect(client).to.equal(client2) | ||
client2.release() | ||
const client3 = yield pool.connect() | ||
expect(client3).not.to.equal(client2) | ||
client3.release() | ||
return yield pool.end() | ||
})) | ||
|
||
it('getting a connection from a pending request gets a fresh client when the released candidate is expended', co.wrap(function * () { | ||
const pool = new Pool({ max: 1, maxUses: 2 }) | ||
expect(pool.waitingCount).to.equal(0) | ||
const client1 = yield pool.connect() | ||
pool.connect() | ||
.then(client2 => { | ||
expect(client2).to.equal(client1) | ||
expect(pool.waitingCount).to.equal(1) | ||
// Releasing the client this time should also expend it since maxUses is 2, causing client3 to be a fresh client | ||
client2.release() | ||
}) | ||
const client3Promise = pool.connect() | ||
.then(client3 => { | ||
// client3 should be a fresh client since client2's release caused the first client to be expended | ||
expect(pool.waitingCount).to.equal(0) | ||
expect(client3).not.to.equal(client1) | ||
return client3.release() | ||
}) | ||
// There should be two pending requests since we have 3 connect requests but a max size of 1 | ||
expect(pool.waitingCount).to.equal(2) | ||
// Releasing the client should not yet expend it since maxUses is 2 | ||
client1.release() | ||
yield client3Promise | ||
return yield pool.end() | ||
})) | ||
|
||
it('logs when removing an expended client', co.wrap(function * () { | ||
const messages = [] | ||
const log = function (msg) { | ||
messages.push(msg) | ||
} | ||
const pool = new Pool({ maxUses: 1, log }) | ||
const client = yield pool.connect() | ||
client.release() | ||
expect(messages).to.contain('remove expended client') | ||
return yield pool.end() | ||
})) | ||
}) |