The live tail reads an upload in pieces while it is posted, and each piece queued a 7z-tail candidate for the last volume it had seen so far (release 306905984: seven, for .002-.008). Only the last volume's end holds the 7z listing. When candidates are stored, and when releases are merged, waiting tails below the release's highest volume are deleted. All tails of the highest volume stay: a piece that saw only part of it queued a segment that is not its last. RAR is unaffected: it lists its files in the first volume's header and gets no tail candidate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
1.7 KiB
TypeScript
31 lines
1.7 KiB
TypeScript
import { test } from '@japa/runner'
|
|
import db from '@adonisjs/lucid/services/db'
|
|
import testUtils from '@adonisjs/core/services/test_utils'
|
|
import { pruneSevenZipTails } from '#services/seven_zip_tails'
|
|
|
|
test.group('7z tails', (group) => {
|
|
group.each.setup(() => testUtils.db().withGlobalTransaction())
|
|
|
|
test("of a release's waiting tails, those below its highest volume go; the highest volume's all stay", async ({ assert }) => {
|
|
const row = (key: string) => ({ release_key: key.padEnd(40, '0'), identity_key: key.padEnd(40, '0'), name: key, source: 'stem', groups: '[]', files: 4 })
|
|
const [merged, other] = (await db.table('releases').multiInsert([row('a'), row('b')]).returning('id')).map((r) => r.id)
|
|
const tail = (releaseId: number, volume: string, mid: string, status = 'waiting') => ({ release_id: releaseId, kind: '7z-tail', message_id: mid, file: `x.7z.${volume}`, status })
|
|
await db.table('probe_candidates').multiInsert([
|
|
// Two merged members' tails, one of the highest volume probed already.
|
|
tail(merged, '002', '<1@x>'),
|
|
tail(merged, '005', '<2@x>'),
|
|
tail(merged, '003', '<3@x>', 'done'),
|
|
tail(merged, '009', '<4@x>', 'taken'),
|
|
// Two pieces that each saw part of volume 009.
|
|
tail(merged, '009', '<5@x>'),
|
|
{ release_id: merged, kind: 'archive', message_id: '<6@x>', file: 'x.7z.001' },
|
|
// Another release: not asked for.
|
|
tail(other, '002', '<7@x>'),
|
|
tail(other, '004', '<8@x>'),
|
|
])
|
|
assert.equal(await pruneSevenZipTails(db, [merged]), 2)
|
|
const left = await db.from('probe_candidates').orderBy('message_id').select('message_id')
|
|
assert.deepEqual(left.map((c) => c.message_id), ['<3@x>', '<4@x>', '<5@x>', '<6@x>', '<7@x>', '<8@x>'])
|
|
})
|
|
})
|