diff --git a/packages/bolt-connection/src/pool/pool.js b/packages/bolt-connection/src/pool/pool.js index 3d4ce8a02..d9ec2b520 100644 --- a/packages/bolt-connection/src/pool/pool.js +++ b/packages/bolt-connection/src/pool/pool.js @@ -251,7 +251,7 @@ class Pool { const key = address.asKey() const pool = this._pools[key] - if (pool && poolState.isActive()) { + if (pool && poolState && poolState.isActive()) { // there exist idle connections for the given key if (!this._validate(resource)) { if (this._log.isDebugEnabled()) { diff --git a/packages/bolt-connection/test/pool/pool.test.js b/packages/bolt-connection/test/pool/pool.test.js index d717ccbc4..7c876a803 100644 --- a/packages/bolt-connection/test/pool/pool.test.js +++ b/packages/bolt-connection/test/pool/pool.test.js @@ -275,6 +275,52 @@ describe('#unit Pool', () => { expect(r1.destroyed).toBeFalsy() }) + it('people are strange', async () => { + let counter = 0 + const address = ServerAddress.fromUrl('bolt://localhost:7687') + const pool = new Pool({ + create: (server, release) => + Promise.resolve(new Resource(server, counter++, release)), + destroy: res => { + res.destroyed = true + return Promise.resolve() + }, + config: new PoolConfig(2, 500) + }) + + // Acquire resource + const r0 = await pool.acquire(address) + expect(pool.has(address)).toBeTruthy() + expect(r0.id).toEqual(0) + + // Purging the key + await pool.purge(address) + expect(pool.has(address)).toBeFalsy() + expect(r0.destroyed).toBeFalsy() + + // Acquiring second resource should recreate the pool + const r1 = await pool.acquire(address) + + const r2 = pool.acquire(address) + + + setTimeout(async () => { + pool._poolState = {} + await r0.close() + }, 700) + + + try { + await r2 + expect(false).toBeTruthy() + } catch(e) { + expect(e.message).toEqual('Connection acquisition timed out in 500 ms. Pool status: Active conn count = 2, Idle conn count = 0.') + } + + await r1.close() + await pool.close() + }) + it('close purges all keys', async () => { let counter = 0