59% of settled releases had complete = NULL: without an [i/N] counter the settler left it unknown, and the "phase 2 reads par2 sets for those" step was never built. A release is now complete when every file its par2 sets describe is there by name or by its first-16-KiB hash, or, for an upload renamed after its par2 was made, when it has as many non-par2 files and bytes. Decided when a par2 index is probed, after a par2 merge, and before the pruner drops a set's file list; the batch store, settler and merger keep a decided value instead of resetting it to NULL. releases:par2-complete decides the releases probed before this. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import { BaseCommand } from '@adonisjs/core/ace'
|
|
import type { CommandOptions } from '@adonisjs/core/types/ace'
|
|
import db from '@adonisjs/lucid/services/db'
|
|
import { decidePar2Completeness } from '#services/par2_completeness'
|
|
|
|
/** Releases per batch. */
|
|
const BATCH = 1000
|
|
|
|
/**
|
|
* Decides completeness by par2 set (app/services/par2_completeness.ts) for the releases that had their par2 read
|
|
* before it was built (2026-10-23): every holder of a set whose file list is still there, by release id. Once.
|
|
*/
|
|
export default class ReleasesPar2Complete extends BaseCommand {
|
|
static commandName = 'releases:par2-complete'
|
|
static description = 'Decides completeness by their par2 sets for settled releases without a counter, then exits'
|
|
static options: CommandOptions = { startApp: true }
|
|
|
|
async run() {
|
|
let after = 0
|
|
let looked = 0
|
|
let decided = 0
|
|
for (;;) {
|
|
const { rows } = await db.rawQuery(
|
|
`SELECT DISTINCT s.release_id FROM par2_sets s
|
|
WHERE s.release_id > ? AND EXISTS (SELECT 1 FROM par2_files f WHERE f.set_id = s.set_id)
|
|
ORDER BY s.release_id LIMIT ?`,
|
|
[after, BATCH]
|
|
)
|
|
if (rows.length === 0) break
|
|
const ids = rows.map((r: { release_id: string }) => Number(r.release_id))
|
|
decided += await decidePar2Completeness(db, ids)
|
|
looked += ids.length
|
|
after = ids.at(-1)!
|
|
if (looked % 50_000 < BATCH) this.logger.info(`${looked} releases with a par2 set looked at, ${decided} decided (up to id ${after}).`)
|
|
}
|
|
this.logger.info(`Done: ${looked} releases with a par2 set looked at, ${decided} decided.`)
|
|
}
|
|
}
|