diff --git a/packages/utils/src/abstract-session.ts b/packages/utils/src/abstract-session.ts index a8fcd048..139c9e12 100644 --- a/packages/utils/src/abstract-session.ts +++ b/packages/utils/src/abstract-session.ts @@ -87,6 +87,7 @@ export abstract class AbstractSession {}) queue.addEventListener('failure', (evt) => { this.log.error('error querying provider %o, evicting from session', evt.detail.job.options.provider, evt.detail.error) + this.evict(evt.detail.job.options.provider) }) queue.addEventListener('success', (evt) => { @@ -188,7 +189,7 @@ export abstract class AbstractSession this.equals(prov, provider)) + return this.evictionFilter.has(this.toEvictionKey(provider)) } hasProvider (provider: Provider): boolean { diff --git a/packages/utils/test/abstract-session.spec.ts b/packages/utils/test/abstract-session.spec.ts index 43228ff2..0ee41945 100644 --- a/packages/utils/test/abstract-session.spec.ts +++ b/packages/utils/test/abstract-session.spec.ts @@ -233,4 +233,27 @@ describe('abstract-session', () => { })).to.eventually.be.rejected() .with.property('code', 'ABORT_ERR') }) + + it('should not make multiple requests to the only found provider', async function () { + this.timeout(1000) + const session: Session | null = new Session() + + const cid = CID.parse('bafybeifaymukvfkyw6xgh4th7tsctiifr4ea2btoznf46y6b2fnvikdczi') + const id = await createEd25519PeerId() // same provider + session.findNewProviders.callsFake(async function * () { + yield { + id + } + }) + + session.queryProvider.callsFake(async () => { + // always fails + throw new Error('Urk!') + }) + + await expect(session.retrieve(cid)).to.eventually.be.rejected() + + expect(session.findNewProviders).to.have.property('callCount', 2) + expect(session.queryProvider).to.have.property('callCount', 1) + }) })