fix(db): WAL valve — TRUNCATE at parked barriers, futility latch, CODEGRAPH_WAL_VALVE_DEBUG (#1334)

Three §7a.1 run-1 lessons (kernel-scale 2c/6GB: EXIT=137, WAL 22.2GB with
the backpressure hook DEPLOYED):

1. TRUNCATE at parked barriers: a completed passive backfill bounds the
   un-checkpointed backlog but the FILE only stops growing when a commit
   finds zero readers holding WAL marks — rare while pool workers cycle
   (dubbo debug baseline: file climbed monotonically through six completed
   pass-1 backfills). At a parked barrier the no-reader window is
   guaranteed, so chop the file there with wal_checkpoint(TRUNCATE)
   (off-thread, 2s busy_timeout — a racing reader degrades it to a no-op).

2. Futility latch: when backfill gives up (pinned reader), parking again at
   every over-cap boundary burns a 20-pass checkpoint attempt — each a
   worker thread + fresh connection against a multi-GB DB — per batch. Two
   consecutive give-ups now disable parking for 60s; a pinned phase degrades
   to pre-valve behavior instead of OOM-amplifying.

3. CODEGRAPH_WAL_VALVE_DEBUG=1 surfaces valve decisions without the
   caller's verbose plumbing, and give-up lines print under
   CODEGRAPH_SYNTH_TIMINGS — run 1 failed silently because give-ups were
   verbose-gated.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Colby Mchenry
2026-07-17 08:17:33 -05:00
committed by GitHub
co-authored by Claude Fable 5
parent b8833fec57
commit 8c1e821495
3 changed files with 85 additions and 5 deletions
+14
View File
@@ -360,3 +360,17 @@ describe('resolution-phase WAL backpressure plumbing (§7a.1)', () => {
await cg.close();
});
});
describe('checkpointWalTruncate (§7a.1 file containment)', () => {
it('chops a fully-backfilled WAL file to zero', async () => {
const db = openDb();
db.setWalAutocheckpoint(0);
writeRows(db, 400);
expect(db.getWalSizeBytes()).toBeGreaterThan(1024 * 1024);
const res = await db.checkpointWalTruncate();
expect(res).not.toBeNull();
expect(res!.busy).toBe(0);
expect(db.getWalSizeBytes()).toBe(0); // the file itself, not just the backlog
db.close();
});
});