Over unreadable >= false Postgres walked every waiting entry of the kind: 2.5 minutes a claim at 28M archive candidates, the prober idle every other minute. Per value each min and max is one end of the ready index (56 ms). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
27 lines
1.5 KiB
TypeScript
27 lines
1.5 KiB
TypeScript
import { test } from '@japa/runner'
|
|
import db from '@adonisjs/lucid/services/db'
|
|
import testUtils from '@adonisjs/core/services/test_utils'
|
|
import { Prober } from '#services/prober'
|
|
|
|
test.group('Prober', (group) => {
|
|
group.each.setup(() => testUtils.db().withGlobalTransaction())
|
|
|
|
test('a claim takes each tier: the readable tiers also take unreadable candidates, a kind with only one of them too', async ({ assert }) => {
|
|
const [row] = await db
|
|
.table('releases')
|
|
.insert({ release_key: 'pb'.padEnd(40, '0'), identity_key: 'pb'.padEnd(40, '0'), name: 'pb', source: 'subject', groups: '[]', files: 3 })
|
|
.returning('id')
|
|
const candidate = (kind: string, unreadable: boolean, ready = true) => ({
|
|
release_id: row.id, kind, message_id: `<${kind}-${unreadable}-${ready}@x>`, file: kind, ready, unreadable,
|
|
})
|
|
// One per kind, so each tier's id range is a single id (the slices' starts aren't random then).
|
|
await db.table('probe_candidates').multiInsert([candidate('lone', true), candidate('par2', true), candidate('archive', false), candidate('7z-tail', false, false)])
|
|
|
|
const prober = new Prober() as any
|
|
await prober.claimTiers()
|
|
assert.sameMembers(prober.queue.map((c: { kind: string }) => c.kind), ['lone', 'par2', 'archive'])
|
|
const status = Object.fromEntries((await db.from('probe_candidates').select('kind', 'status')).map((c) => [c.kind, c.status]))
|
|
assert.deepEqual(status, { 'lone': 'taken', 'par2': 'taken', 'archive': 'taken', '7z-tail': 'waiting' })
|
|
})
|
|
})
|