From 59c93071c7ecad237c0b26eff54cbee27b356f6c Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Thu, 15 Oct 2026 15:48:30 +0200 Subject: [PATCH] The sidecar fold every 5 min inside a long par2 pass too Co-Authored-By: Claude Opus 5.5 --- app/services/par2_merger.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/services/par2_merger.ts b/app/services/par2_merger.ts index e7caa70..073c7c0 100644 --- a/app/services/par2_merger.ts +++ b/app/services/par2_merger.ts @@ -18,6 +18,8 @@ const SLACK_FILES = 10 const ROUND_MS = 60_000 /** A round looks back this far past the previous one's start (rows committed while it ran). */ const OVERLAP_MS = 60_000 +/** The sidecar fold also runs this often inside a long par2 pass: its queue grows by the settler's pace. */ +const FOLD_EVERY_MS = 5 * 60_000 /** The merger's row in worker_cursors: the start of its last whole round, kept over a restart. */ const CURSOR = 'merger' @@ -108,6 +110,16 @@ export class Par2Merger { // First: sidecars (.nfo, .sfv, .nzb) apart from their upload join it. A queue, not since: it needn't wait for the // par2 pass (hours when that starts over). const folded = await this.folder.round() + let foldedAt = Date.now() + const foldAgain = async () => { + if (Date.now() - foldedAt < FOLD_EVERY_MS) return + const more = await this.folder.round() + folded.looked += more.looked + folded.sidecars += more.sidecars + folded.folded += more.folded + foldedAt = Date.now() + if (more.folded) logger.info(`Folded ${more.folded} sidecars into their uploads (${more.sidecars} sidecar-only of ${more.looked} small releases).`) + } const { rows } = await db.rawQuery( `SELECT set_id FROM par2_sets WHERE created_at >= ? UNION @@ -117,6 +129,7 @@ export class Par2Merger { const round: MergeRound = { sets: rows.length, merges: 0, releases: 0, stems: 0, stemMerges: 0, stemReleases: 0, folded } for (const { set_id: setId } of rows) { if (this.stopped) return round + await foldAgain() // One set that fails doesn't hold up the others (nor the next round, which would start from the same point). const merged = await this.mergeSet(setId.trim()).catch((error) => { logger.error(`Par2 merge of set ${setId.trim()} failed: ${error.message}`)