From f57a4d3669ffd05f71aea021c1c069f57814dfa7 Mon Sep 17 00:00:00 2001 From: Etan Joseph Heyman Date: Sun, 8 Nov 2026 13:22:43 +0200 Subject: [PATCH 1/2] perf(server): trace database reclamation once per pass Database reclamation runs two PRAGMAs for every freed page, up to 1,024 pages a minute, and each one became its own sqlite span. On a busy install that was a quarter of the rotating server trace. Suppress the per-statement spans and keep one DatabaseStorage.reclaim span per pass that records the reclaimed page count. gpt-6.1-sol via T3 Code / Codex harness; reviewed by Claude Opus 5.5 via T3 Code. Co-Authored-By: GPT-6.1 Sol Co-Authored-By: Claude Opus 5.5 --- .../src/persistence/DatabaseStorage.test.ts | 22 +++++++++++++++++-- .../server/src/persistence/DatabaseStorage.ts | 7 +++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/server/src/persistence/DatabaseStorage.test.ts b/apps/server/src/persistence/DatabaseStorage.test.ts index 73a0d4cac7cd..fbae10c4ae35 100644 --- a/apps/server/src/persistence/DatabaseStorage.test.ts +++ b/apps/server/src/persistence/DatabaseStorage.test.ts @@ -5,6 +5,7 @@ import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; import * as Layer from "effect/Layer"; import * as Path from "effect/Path"; +import * as Tracer from "effect/Tracer"; import * as TestClock from "effect/testing/TestClock"; import * as SqlClient from "effect/sql/SqlClient"; @@ -41,9 +42,26 @@ it.effect("a new database returns freed pages online without losing data", () => yield* sql`CREATE TABLE retained (value TEXT)`; yield* sql`INSERT INTO retained VALUES ('keep')`; yield* sql`CREATE TABLE discarded (value BLOB)`; - yield* sql`INSERT INTO discarded VALUES (zeroblob(1048576))`; + yield* sql`INSERT INTO discarded VALUES (zeroblob(6291456))`; yield* sql`DROP TABLE discarded`; - assert.isAbove(yield* freePages, 0); + const before = yield* freePages; + assert.isAbove(before, 1024); + const spans: Array = []; + const tracer = Tracer.make({ + span(options) { + const span = new Tracer.NativeSpan(options); + spans.push(span); + return span; + }, + }); + yield* storage.reclaim.pipe(Effect.withTracer(tracer), Effect.withTracerEnabled(true)); + assert.equal(before - (yield* freePages), 1024); + assert.lengthOf(spans, 1); + assert.deepEqual( + spans.map((span) => span.name), + ["DatabaseStorage.reclaim"], + ); + assert.equal(spans[0]?.attributes.get("db.reclaimed_pages"), 1024); yield* storage.reclaim; assert.equal(yield* freePages, 0); assert.deepEqual(yield* sql`SELECT value FROM retained`, [{ value: "keep" }]); diff --git a/apps/server/src/persistence/DatabaseStorage.ts b/apps/server/src/persistence/DatabaseStorage.ts index a0dd307237d4..4e0612ad30c9 100644 --- a/apps/server/src/persistence/DatabaseStorage.ts +++ b/apps/server/src/persistence/DatabaseStorage.ts @@ -85,14 +85,19 @@ const make = Effect.gen(function* () { const reclaim = Effect.gen(function* () { if (!(yield* readLayout).incrementalVacuum) return; // The driver steps once per statement; incremental_vacuum frees one page per step. Yield between pages. - for (let page = 0; page < RECLAIM_PAGES_PER_PASS; page++) { + let page = 0; + for (; page < RECLAIM_PAGES_PER_PASS; page++) { const free = yield* sql<{ readonly freelist_count: number }>`PRAGMA freelist_count`; if ((free[0]?.freelist_count ?? 0) === 0) break; yield* sql`PRAGMA incremental_vacuum(1)`; yield* Effect.yieldNow; } + yield* Effect.annotateCurrentSpan("db.reclaimed_pages", page); }).pipe( Effect.catch((cause) => Effect.logWarning("Database space reclamation failed", { cause })), + // The pass owns the span; tracing each page's two PRAGMAs floods the server trace. + Effect.withTracerEnabled(false), + Effect.withSpan("DatabaseStorage.reclaim"), ); // Even a pass that deletes nothing scans the event store. Persist completion From 476ab936b0fd2c2f96a7f50d5137ea096f825d65 Mon Sep 17 00:00:00 2001 From: Etan Joseph Heyman Date: Sun, 8 Nov 2026 13:42:59 +0200 Subject: [PATCH 2/2] perf(server): every reclaim span records its page count The page count was annotated only after a completed loop, so a pass on a database without incremental vacuum, or one that failed partway, ended its span without it. Annotate in a finalizer instead. Claude Opus 5.5 via T3 Code. Co-Authored-By: Claude Opus 5.5 --- .../server/src/persistence/DatabaseStorage.ts | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/apps/server/src/persistence/DatabaseStorage.ts b/apps/server/src/persistence/DatabaseStorage.ts index 4e0612ad30c9..596c387d88f0 100644 --- a/apps/server/src/persistence/DatabaseStorage.ts +++ b/apps/server/src/persistence/DatabaseStorage.ts @@ -82,23 +82,25 @@ const make = Effect.gen(function* () { Effect.catch((cause) => Effect.logWarning("Database storage inspection failed", { cause })), ); - const reclaim = Effect.gen(function* () { - if (!(yield* readLayout).incrementalVacuum) return; - // The driver steps once per statement; incremental_vacuum frees one page per step. Yield between pages. + const reclaim = Effect.suspend(() => { let page = 0; - for (; page < RECLAIM_PAGES_PER_PASS; page++) { - const free = yield* sql<{ readonly freelist_count: number }>`PRAGMA freelist_count`; - if ((free[0]?.freelist_count ?? 0) === 0) break; - yield* sql`PRAGMA incremental_vacuum(1)`; - yield* Effect.yieldNow; - } - yield* Effect.annotateCurrentSpan("db.reclaimed_pages", page); - }).pipe( - Effect.catch((cause) => Effect.logWarning("Database space reclamation failed", { cause })), - // The pass owns the span; tracing each page's two PRAGMAs floods the server trace. - Effect.withTracerEnabled(false), - Effect.withSpan("DatabaseStorage.reclaim"), - ); + return Effect.gen(function* () { + if (!(yield* readLayout).incrementalVacuum) return; + // The driver steps once per statement; incremental_vacuum frees one page per step. Yield between pages. + for (; page < RECLAIM_PAGES_PER_PASS; page++) { + const free = yield* sql<{ readonly freelist_count: number }>`PRAGMA freelist_count`; + if ((free[0]?.freelist_count ?? 0) === 0) break; + yield* sql`PRAGMA incremental_vacuum(1)`; + yield* Effect.yieldNow; + } + }).pipe( + Effect.ensuring(Effect.suspend(() => Effect.annotateCurrentSpan("db.reclaimed_pages", page))), + Effect.catch((cause) => Effect.logWarning("Database space reclamation failed", { cause })), + // The pass owns the span; tracing each page's two PRAGMAs floods the server trace. + Effect.withTracerEnabled(false), + Effect.withSpan("DatabaseStorage.reclaim"), + ); + }); // Even a pass that deletes nothing scans the event store. Persist completion // so restarting does not trigger another scan before the six-hour interval.