Prune par2_files of complete and judged sets (hourly, from the merger)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
dd35b49a3f
commit
1a20fcd2c3
3 files changed
+159
No files matched your search
@@ -0,0 +1,68 @@
|
||||
import { test } from '@japa/runner'
|
||||
import db from '@adonisjs/lucid/services/db'
|
||||
import testUtils from '@adonisjs/core/services/test_utils'
|
||||
import { Par2Pruner } from '#services/par2_pruner'
|
||||
|
||||
test.group('Par2Pruner', (group) => {
|
||||
group.each.setup(() => testUtils.db().withGlobalTransaction())
|
||||
|
||||
test('drops the file lists of complete and judged sets, keeps the rest', async ({ assert }) => {
|
||||
const old = new Date(Date.now() - 3 * 86400_000)
|
||||
let n = 0
|
||||
const release = async () => {
|
||||
n++
|
||||
const key = `pp${String(n).padStart(6, '0')}`.padEnd(40, '0')
|
||||
const [row] = await db
|
||||
.table('releases')
|
||||
.insert({ release_key: key, identity_key: key, name: key, source: 'stem', groups: '[]', group_id: 1, files: 2, readable: false })
|
||||
.returning('id')
|
||||
return Number(row.id)
|
||||
}
|
||||
let candidate = 5000
|
||||
const set = async (letter: string, holder: number, files: number, hashedIn: number | null, created = old) => {
|
||||
const setId = letter.repeat(32)
|
||||
for (let i = 0; i < files; i++) {
|
||||
const h = `${letter}${i}`.padEnd(32, '0')
|
||||
await db.table('par2_files').insert({ set_id: setId, file_id: h, hash16k: h, length: 1000 + i, name: `f${i}.rar` })
|
||||
if (hashedIn && i < files) {
|
||||
candidate++
|
||||
await db.table('probe_candidates').insert({ id: candidate, release_id: hashedIn, kind: 'lone', message_id: `<${candidate}@x>`, file: 'x', status: 'done' })
|
||||
await db.table('file_hashes').insert({ candidate_id: candidate, release_id: hashedIn, hash16k: h, size: 1000 + i })
|
||||
}
|
||||
}
|
||||
await db.table('par2_sets').insert({ set_id: setId, release_id: holder, files, created_at: created })
|
||||
return setId
|
||||
}
|
||||
const count = async (setId: string) => Number((await db.from('par2_files').where('set_id', setId).count('* as n'))[0].n)
|
||||
|
||||
// Every file's hash in the holder: complete.
|
||||
const a = await release()
|
||||
const complete = await set('a', a, 2, a)
|
||||
// The files hashed in another release (not merged): kept.
|
||||
const b = await release()
|
||||
const apart = await set('b', b, 2, await release())
|
||||
// Complete but recent: kept (its merges may come).
|
||||
const c = await release()
|
||||
const recent = await set('c', c, 2, c, new Date())
|
||||
// Nothing hashed, its only holder dead: judged.
|
||||
const d = await release()
|
||||
const dead = await set('d', d, 2, null, new Date())
|
||||
await db.table('release_verdicts').insert({ release_id: d, rule: 'dead', rule_version: 1 })
|
||||
// Locked isn't junk: kept.
|
||||
const e = await release()
|
||||
const locked = await set('e', e, 2, null)
|
||||
await db.table('release_verdicts').insert({ release_id: e, rule: 'locked', rule_version: 1 })
|
||||
|
||||
const round = await new Par2Pruner().round()
|
||||
assert.deepEqual(round, { complete: 1, judged: 1, rows: 4 })
|
||||
assert.equal(await count(complete), 0)
|
||||
assert.equal(await count(apart), 2)
|
||||
assert.equal(await count(recent), 2)
|
||||
assert.equal(await count(dead), 0)
|
||||
assert.equal(await count(locked), 2)
|
||||
assert.equal((await db.from('par2_sets').count('* as n'))[0].n, '5')
|
||||
|
||||
// Again: the cursor is past them, nothing more.
|
||||
assert.deepEqual(await new Par2Pruner().round(), { complete: 0, judged: 0, rows: 0 })
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user