Par2 naming needs the fingerprint inspection stores on a binary, and the GC deleted seeded binaries (6 h unfingerprinted, 48 h stale) long before the inspection queue reached them. binaries.awaiting_inspection protects them for up to 7 days; the GC deletes use partial indexes so they don't read past waiting rows. Seeding no longer creates binaries for files that aren't inspected (~85% of a.b.ath), which only churned the table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import { BaseSchema } from '@adonisjs/lucid/schema'
|
|
|
|
/**
|
|
* Indexes for the GC's deletes of finished binaries, without the ones
|
|
* waiting for inspection (LOG.md 2026-10-06 (11)): those can be millions
|
|
* when inspection is behind, and the deletes must not read past them every
|
|
* sweep. Built CONCURRENTLY: binaries takes writes all the time.
|
|
*/
|
|
export default class extends BaseSchema {
|
|
static disableTransactions = true
|
|
|
|
async up() {
|
|
await this.db.rawQuery(
|
|
`CREATE INDEX CONCURRENTLY IF NOT EXISTS binaries_done_last_seen_idx ON binaries (last_seen_at)
|
|
WHERE file_id IS NOT NULL AND awaiting_inspection IS NOT TRUE`
|
|
)
|
|
await this.db.rawQuery(
|
|
`CREATE INDEX CONCURRENTLY IF NOT EXISTS binaries_awaiting_inspection_idx ON binaries (last_seen_at)
|
|
WHERE awaiting_inspection IS TRUE`
|
|
)
|
|
await this.db.rawQuery(
|
|
`CREATE INDEX CONCURRENTLY IF NOT EXISTS binaries_open_last_seen_idx ON binaries (last_seen_at)
|
|
WHERE completed_at IS NULL OR conflicted_at IS NOT NULL`
|
|
)
|
|
}
|
|
|
|
async down() {
|
|
await this.db.rawQuery(`DROP INDEX CONCURRENTLY IF EXISTS binaries_open_last_seen_idx`)
|
|
await this.db.rawQuery(`DROP INDEX CONCURRENTLY IF EXISTS binaries_awaiting_inspection_idx`)
|
|
await this.db.rawQuery(`DROP INDEX CONCURRENTLY IF EXISTS binaries_done_last_seen_idx`)
|
|
}
|
|
}
|