diff --git a/packages/bolt-connection/src/pool/pool.js b/packages/bolt-connection/src/pool/pool.js index d9ec2b520..3af1b3114 100644 --- a/packages/bolt-connection/src/pool/pool.js +++ b/packages/bolt-connection/src/pool/pool.js @@ -300,16 +300,18 @@ class Pool { async _purgeKey (key) { const pool = this._pools[key] || [] const poolState = this._poolState[key] || new PoolState() + const destructionList = [] while (pool.length) { const resource = pool.pop() if (this._removeIdleObserver) { this._removeIdleObserver(resource) } - await this._destroy(resource) + destructionList.push(this._destroy(resource)) } poolState.close() delete this._pools[key] delete this._poolState[key] + await Promise.all(destructionList) } _processPendingAcquireRequests (address) { diff --git a/packages/bolt-connection/test/pool/pool.test.js b/packages/bolt-connection/test/pool/pool.test.js index 7c876a803..a42a36686 100644 --- a/packages/bolt-connection/test/pool/pool.test.js +++ b/packages/bolt-connection/test/pool/pool.test.js @@ -923,6 +923,43 @@ describe('#unit Pool', () => { expect(resource1.observer).toBeFalsy() expect(resource2.observer).toBeFalsy() }) + + 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) {