diff --git a/packages/bolt-connection/src/pool/pool.js b/packages/bolt-connection/src/pool/pool.js index 60d0f104f..d23f8f8cf 100644 --- a/packages/bolt-connection/src/pool/pool.js +++ b/packages/bolt-connection/src/pool/pool.js @@ -292,16 +292,18 @@ class Pool { async _purgeKey (key) { const pool = this._pools[key] + const destructionList = [] if (pool) { while (pool.length) { const resource = pool.pop() if (this._removeIdleObserver) { this._removeIdleObserver(resource) } - await this._destroy(resource) + destructionList.push(this._destroy(resource)) } pool.close() delete this._pools[key] + await Promise.all(destructionList) } } diff --git a/packages/bolt-connection/test/pool/pool.test.js b/packages/bolt-connection/test/pool/pool.test.js index 75ab484c0..2037cd8b5 100644 --- a/packages/bolt-connection/test/pool/pool.test.js +++ b/packages/bolt-connection/test/pool/pool.test.js @@ -878,7 +878,7 @@ describe('#unit Pool', () => { expect(resource2.observer).toBeFalsy() }) - it('should thrown aquisition timeout exception if resource takes longer to be created', async () => { + it('should thrown acquisition timeout exception if resource takes longer to be created', async () => { const address = ServerAddress.fromUrl('bolt://localhost:7687') const acquisitionTimeout = 1000 let counter = 0 @@ -911,6 +911,43 @@ describe('#unit Pool', () => { expect(counter).toEqual(1) } }) + + it('should purge resources in parallel', async () => { + const address = ServerAddress.fromUrl('bolt://localhost:7687') + let resourceCount = 0 + const resourcesReleased = [] + let resolveRelease + const releasePromise = new Promise((resolve) => { + resolveRelease = resolve + }) + + const pool = new Pool({ + create: (server, release) => + Promise.resolve(new Resource(server, resourceCount++, release)), + destroy: res => { + resourcesReleased.push(res) + resourceCount-- + // Only destroy when the last resource + // get destroyed + if (resourceCount === 0) { + resolveRelease() + } + return releasePromise + }, + validate: res => true + }) + + const resource1 = await pool.acquire(address) + const resource2 = await pool.acquire(address) + await resource1.close() + await resource2.close() + + await pool.purge(address) + + expect(resourcesReleased).toEqual([ + resource2, resource1 + ]) + }) }) function expectNoPendingAcquisitionRequests (pool) { diff --git a/packages/neo4j-driver/test/temporal-types.test.js b/packages/neo4j-driver/test/temporal-types.test.js index 240799259..39733e8fe 100644 --- a/packages/neo4j-driver/test/temporal-types.test.js +++ b/packages/neo4j-driver/test/temporal-types.test.js @@ -354,7 +354,7 @@ describe('#integration temporal-types', () => { await testSendAndReceiveRandomTemporalValues(() => randomLocalDateTime()) }, 60000) - it('should send and receive random LocalDateTime', async () => { + it('should send and receive array of random LocalDateTime', async () => { if (neo4jDoesNotSupportTemporalTypes()) { return }