fix(resolution): WAL containment for the pooled superphase — writer backpressure at pool-idle boundaries (#1332)
At kernel scale the pooled resolution/synthesis superphase grew a 22GB WAL on a 4.6GB DB (cg1212, §7a.1): autocheckpointing is deferred for the run, and the valve's timer-driven passive checkpoints stay perpetually partial against the pool's continuous reads — no mechanism ever completed a backfill, so the WAL accreted the whole phase's write volume, blowing disk and feeding page-cache pressure into the 8-core/7GB container OOM. The valve's writer-side backpressure() hard-cap backstop existed but was wired only into the PARSE orchestrator. Thread it into the resolution batch loop at the double-buffer's one pool-idle boundary (batch settled, next not yet fanned out), after the edge-index recreate, and through the synthesis insert loops. Parked there, the backfill completes; readers re-enter at SQLite's backfilled mark and the next persist commit wraps the WAL. Dubbo validation, same build: valve@16MB peak WAL 251MB (floor = the single-transaction edge-index recreate) vs defaults 914MB; dumps byte-identical (441,270 rows); wall unchanged (11s). Suite 2,479 green. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
04ab45c91f
commit
6e52295ceb
+10
-2
@@ -591,7 +591,8 @@ export class CodeGraph {
|
||||
current: done,
|
||||
total: totalPasses,
|
||||
});
|
||||
}
|
||||
},
|
||||
walValve ? () => walValve!.backpressure() : undefined
|
||||
);
|
||||
if (process.env.CODEGRAPH_SYNTH_TIMINGS) console.error(`[phase-timing] resolution: ${Date.now() - tResolve}ms`);
|
||||
|
||||
@@ -1145,7 +1146,13 @@ export class CodeGraph {
|
||||
*/
|
||||
async resolveReferencesBatched(
|
||||
onProgress?: (current: number, total: number) => void,
|
||||
onSynthesisProgress?: (done: number, total: number) => void
|
||||
onSynthesisProgress?: (done: number, total: number) => void,
|
||||
// The WAL valve's writer-side backstop, threaded into the batch loop's
|
||||
// pool-idle boundaries. Without it the valve's only lever during
|
||||
// resolution is timer-driven passive checkpoints, which the pool's
|
||||
// continuous reads keep perpetually partial — the WAL then accretes the
|
||||
// whole phase's write volume (22GB on a 4.6GB DB at kernel scale).
|
||||
backpressure?: () => Promise<void> | null
|
||||
): Promise<ResolutionResult> {
|
||||
return this.resolver.resolveAndPersistBatched(onProgress, undefined, onSynthesisProgress, {
|
||||
dbPath: this.db.getPath(),
|
||||
@@ -1158,6 +1165,7 @@ export class CodeGraph {
|
||||
begin: () => this.db.beginBulkEdgeLoad(),
|
||||
end: () => this.db.endBulkEdgeLoad(),
|
||||
},
|
||||
backpressure,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user