From fa52d9256b0976e7ac64d6cf8d021e937ae5135c Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Sun, 11 Oct 2026 14:21:44 +0200 Subject: [PATCH] Rebuild: a chunk reported corrupt gets a second plain try before the range fails Range 161820 failed with "doesn't inflate, also fetched plain" though the chunk was likely the compressed copy again: in flight, or spooled before the prefetcher's targets were refreshed, when the plain flag was set. The range now fails only on the third report. Co-Authored-By: Claude Opus 5.5 --- app/services/leases.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/services/leases.ts b/app/services/leases.ts index 1a53222..a10b555 100644 --- a/app/services/leases.ts +++ b/app/services/leases.ts @@ -68,7 +68,9 @@ class Leases { const span = Spool.chunksOf({ start: Number(range.start_id), end: Number(range.end_id) }).find((s) => s.from === from) if (span) await Spool.removeChunk(rangeId, span) const plain: number[] = (range.plain_chunks ?? []).map(Number) - if (plain.includes(from)) { + // Reported once already: the compressed copy may have been in flight (or the prefetcher's targets not + // refreshed yet) and spooled again (range 161820, LOG.md 2026-10-11), so a second try plain first. + if (plain.filter((p) => p === from).length >= 2) { // Fetched plain (deflated here) and still not inflating: not the server's compression; set aside. await db.from('ranges').where('id', rangeId).update({ status: 'failed', node_id: null, error: `chunk ${from} doesn't inflate, also fetched plain` }) return