From f335d759da5fa3132cc6a9d4033fdaadc1cb7439 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 20 May 2024 11:25:38 +0100 Subject: [PATCH] fix: check eviction filter for new providers When new providers are found, check the eviction filter in `isEvicted` rather than the current list of providers. Fixes #501 --- packages/utils/src/abstract-session.ts | 3 ++- packages/utils/test/abstract-session.spec.ts | 23 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) 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) + }) })