Skip to content

Commit 1a6e4d7

Browse files
authored
Merge pull request #466 from ali-ince/1.7-connection-leak-fix
Ensure idle observers are removed when purging
2 parents 8ac9bbb + 528294c commit 1a6e4d7

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

src/v1/internal/pool.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,10 @@ class Pool {
210210
if (this._installIdleObserver) {
211211
this._installIdleObserver(resource, {
212212
onError: () => {
213-
this._pools[key] = this._pools[key].filter(r => r !== resource)
213+
const pool = this._pools[key]
214+
if (pool) {
215+
this._pools[key] = pool.filter(r => r !== resource)
216+
}
214217
this._destroy(resource)
215218
}
216219
})
@@ -235,6 +238,9 @@ class Pool {
235238
const pool = this._pools[key] || []
236239
while (pool.length) {
237240
const resource = pool.pop()
241+
if (this._removeIdleObserver) {
242+
this._removeIdleObserver(resource)
243+
}
238244
this._destroy(resource)
239245
}
240246
delete this._pools[key]

test/internal/connection-providers.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ describe('DirectConnectionProvider', () => {
5151
})
5252

5353
describe('LoadBalancer', () => {
54+
let originalTimeout
55+
beforeEach(function () {
56+
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL
57+
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000
58+
})
59+
60+
afterEach(function () {
61+
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout
62+
})
63+
5464
const server0 = ServerAddress.fromUrl('server0')
5565
const server1 = ServerAddress.fromUrl('server1')
5666
const server2 = ServerAddress.fromUrl('server2')

test/internal/http/http-request-runner.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ const VALID_URI = 'http://localhost'
2828
const INVALID_URI = 'http://not-localhost'
2929

3030
describe('http request runner', () => {
31+
let originalTimeout
32+
beforeEach(function () {
33+
originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL
34+
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000
35+
})
36+
37+
afterEach(function () {
38+
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout
39+
})
40+
3141
it('should begin transaction', done => {
3242
if (testUtils.isServer()) {
3343
done()

test/internal/pool.test.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,38 @@ describe('Pool', () => {
866866
})
867867
})
868868
})
869+
870+
it('should clean-up idle observer on purge', done => {
871+
const address = ServerAddress.fromUrl('bolt://localhost:7687')
872+
let resourceCount = 0
873+
874+
const pool = new Pool({
875+
create: (server, release) =>
876+
Promise.resolve(new Resource(server, resourceCount++, release)),
877+
destroy: resource => {},
878+
validate: resource => true,
879+
installIdleObserver: (resource, observer) => {
880+
resource['observer'] = observer
881+
},
882+
removeIdleObserver: resource => {
883+
delete resource['observer']
884+
}
885+
})
886+
887+
pool.acquire(address).then(resource1 => {
888+
pool.acquire(address).then(resource2 => {
889+
resource1.close()
890+
resource2.close()
891+
892+
pool.purge(address)
893+
894+
expect(resource1['observer']).toBeFalsy()
895+
expect(resource2['observer']).toBeFalsy()
896+
897+
done()
898+
})
899+
})
900+
})
869901
})
870902

871903
function expectNoPendingAcquisitionRequests (pool) {

0 commit comments

Comments
 (0)