Keep only the 7z tails of a release's highest volume
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>
This commit is contained in:
1 parent
b60d716db0
commit
3b61215f6b
6 files changed
+82
-1
No files matched your search
@@ -132,6 +132,28 @@ test.group('BatchStore', (group) => {
|
||||
assert.lengthOf(await releasesOf(), 1)
|
||||
})
|
||||
|
||||
test('a split 7z read in pieces keeps the tail of its highest volume only; RAR gets none', async ({ assert }) => {
|
||||
// As the live tail reads it while posted: each piece queues a tail for the last volume it saw so far.
|
||||
await storeIn(GROUP, 1, [
|
||||
...upload(10, 'TsIgNBewuFbuwWy.7z.001', 2, '[1/4]', '2026-10-23T08:24:00Z'),
|
||||
...upload(20, 'TsIgNBewuFbuwWy.7z.002', 2, '[2/4]', '2026-10-23T08:26:00Z'),
|
||||
])
|
||||
await storeIn(GROUP, 100_001, upload(100_010, 'TsIgNBewuFbuwWy.7z.004', 2, '[4/4]', '2026-10-23T08:30:00Z'))
|
||||
// A lower volume posted late: its tail goes at once.
|
||||
await storeIn(GROUP, 200_001, upload(200_010, 'TsIgNBewuFbuwWy.7z.003', 2, '[3/4]', '2026-10-23T08:28:00Z'))
|
||||
await storeIn(GROUP, 300_001, upload(300_010, 'Some.Show.S01E03.part01.rar', 2, 'Some.Show.S01E03 [1/2]', '2026-10-23T09:00:00Z'))
|
||||
await storeIn(GROUP, 400_001, upload(400_010, 'Some.Show.S01E03.part02.rar', 2, 'Some.Show.S01E03 [2/2]', '2026-10-23T09:02:00Z'))
|
||||
const candidates = await db.from('probe_candidates').orderBy('file').select('kind', 'file')
|
||||
assert.deepEqual(
|
||||
candidates.map((c) => [c.kind, c.file]),
|
||||
[
|
||||
['archive', 'Some.Show.S01E03.part01.rar'],
|
||||
['archive', 'TsIgNBewuFbuwWy.7z.001'],
|
||||
['7z-tail', 'TsIgNBewuFbuwWy.7z.004'],
|
||||
]
|
||||
)
|
||||
})
|
||||
|
||||
test('the same upload in another group (multi-posted) is a release of its own', async ({ assert }) => {
|
||||
await storeIn(GROUP, 1, upload(10, 'Some.Show.S01E01.1080p.mkv', 2, 'Some.Show.S01E01.1080p [1/1]', '2026-10-05T10:00:00Z'))
|
||||
await storeIn('alt.binaries.other', 1, upload(10, 'Some.Show.S01E01.1080p.mkv', 2, 'Some.Show.S01E01.1080p [1/1]', '2026-10-05T10:01:00Z', 'alt.binaries.other'))
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
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>'])
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user