Skip to content

Commit

Permalink
fix: check eviction filter for new providers
Browse files Browse the repository at this point in the history
When new providers are found, check the eviction filter in `isEvicted`
rather than the current list of providers.

Fixes #501
  • Loading branch information
achingbrain committed May 20, 2024
1 parent e6b976a commit f335d75
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
3 changes: 2 additions & 1 deletion packages/utils/src/abstract-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ export abstract class AbstractSession<Provider, RetrieveBlockProgressEvents exte
queue.addEventListener('error', () => {})
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) => {
Expand Down Expand Up @@ -188,7 +189,7 @@ export abstract class AbstractSession<Provider, RetrieveBlockProgressEvents exte
}

isEvicted (provider: Provider): boolean {
return this.providers.some(prov => this.equals(prov, provider))
return this.evictionFilter.has(this.toEvictionKey(provider))
}

hasProvider (provider: Provider): boolean {
Expand Down
23 changes: 23 additions & 0 deletions packages/utils/test/abstract-session.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
})

0 comments on commit f335d75

Please sign in to comment.