From 7c1146ef8c36dfb068e1f4173e32dd9a89536126 Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Sun, 1 Nov 2026 10:44:02 -0600 Subject: [PATCH] perf(server): settings loads skip the provider history query when nothing needs migrating Every settings load, including the reload inside each settings save and each settings-file watcher event, queried projection_thread_sessions and provider_session_runtime for previously used providers. Only the legacy `providers` migration uses that result, and after the migration rewrites settings.json the map is gone, so steady-state loads threw it away. Run the query only in the branch that migrates a legacy `providers` map. Co-Authored-By: Claude Opus 5.5 --- apps/server/src/serverSettings.test.ts | 25 +++++++++++++++++++++++++ apps/server/src/serverSettings.ts | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/apps/server/src/serverSettings.test.ts b/apps/server/src/serverSettings.test.ts index ef8b4d6afae79..7616325d62e9d 100644 --- a/apps/server/src/serverSettings.test.ts +++ b/apps/server/src/serverSettings.test.ts @@ -990,6 +990,31 @@ it.layer(NodeServices.layer)("server settings", (it) => { }).pipe(Effect.provide(layerServerSettings())), ); + it.effect("reads provider history only when legacy provider settings need migrating", () => + Effect.gen(function* () { + const serverConfig = yield* ServerConfig.ServerConfig; + const fileSystem = yield* FileSystem.FileSystem; + const serverSettings = yield* ServerSettingsModule.ServerSettingsService; + const sql = yield* SqlClient.SqlClient; + yield* sql`DROP TABLE provider_session_runtime`; + yield* fileSystem.writeFileString( + serverConfig.settingsPath, + JSON.stringify({ providers: { grok: { binaryPath: "/opt/grok" } } }), + ); + + const error = yield* Effect.flip(serverSettings.getSettings); + assert.equal(error.operation, "read-provider-history"); + + yield* fileSystem.writeFileString( + serverConfig.settingsPath, + JSON.stringify({ addProjectBaseDirectory: "~/Development" }), + ); + + const settings = yield* serverSettings.getSettings; + assert.equal(settings.addProjectBaseDirectory, "~/Development"); + }).pipe(Effect.provide(layerServerSettings())), + ); + it.effect("migrates legacy providers from an invalid file without rewriting it", () => Effect.gen(function* () { const serverConfig = yield* ServerConfig.ServerConfig; diff --git a/apps/server/src/serverSettings.ts b/apps/server/src/serverSettings.ts index 67a1c3c3414f3..151647aa72bdc 100644 --- a/apps/server/src/serverSettings.ts +++ b/apps/server/src/serverSettings.ts @@ -737,7 +737,7 @@ const make = Effect.gen(function* () { // A file that failed to decode must stay on disk for the user to repair. const settingsFileTrusted = Option.isNone(parseFailure); - const providerHistory = yield* sql<{ + const readProviderHistory = sql<{ readonly providerName: string; readonly providerInstanceId: string | null; }>` @@ -791,7 +791,7 @@ const make = Effect.gen(function* () { const loaded = foldProviderInstanceEnabledFlags( legacyProviders === undefined ? settings - : migrateLegacyProviderSettings(settings, legacyProviders, providerHistory), + : migrateLegacyProviderSettings(settings, legacyProviders, yield* readProviderHistory), ); const folded = settingsFileTrusted ? foldLegacyProjectSettings(loaded, legacyProjectRows)