From ecfdf93ce81c6b2dab2ff1ce65f23f684b8950d2 Mon Sep 17 00:00:00 2001 From: Antonio Barcelos Date: Mon, 12 Sep 2022 16:43:19 +0200 Subject: [PATCH] Improve purge address of the Pool routine In Browser environments, the WebSocket release can take seconds to finish. This behaviour can make LDAP authentication expired take more time then usual. Purging the connection in parallel speeds up this process. --- packages/bolt-connection/src/pool/pool.js | 4 +- .../bolt-connection/test/pool/pool.test.js | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) 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) {