From b8d0b20fd8d68227c8c59a4ac153f54a858ac186 Mon Sep 17 00:00:00 2001 From: Samuel Stroschein <35429197+samuelstroschein@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:55:34 -0800 Subject: [PATCH] Remove shutdown wait on fileQueueSettled and silence known shutdown noise in CLI --- .changeset/shaggy-parrots-juggle.md | 7 +++++ .../cli/src/commands/machine/translate.ts | 6 +--- packages/cli/src/commands/validate/index.ts | 6 +--- packages/cli/src/main.ts | 2 ++ .../silenceKnownShutdownNoise.ts | 31 +++++++++++++++++++ .../cli/src/utilities/getInlangProject.ts | 12 ------- 6 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 .changeset/shaggy-parrots-juggle.md create mode 100644 packages/cli/src/services/error-monitoring/silenceKnownShutdownNoise.ts diff --git a/.changeset/shaggy-parrots-juggle.md b/.changeset/shaggy-parrots-juggle.md new file mode 100644 index 0000000000..56fa2aafa2 --- /dev/null +++ b/.changeset/shaggy-parrots-juggle.md @@ -0,0 +1,7 @@ +--- +"@inlang/cli": patch +--- + +Fix CLI commands not terminating by removing the shutdown wait on `fileQueueSettled`. + +Also silence known non-actionable shutdown noise from background file queue processing when the DB is already closed. diff --git a/packages/cli/src/commands/machine/translate.ts b/packages/cli/src/commands/machine/translate.ts index 70e151b3ee..b8e2357469 100644 --- a/packages/cli/src/commands/machine/translate.ts +++ b/packages/cli/src/commands/machine/translate.ts @@ -1,10 +1,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Command } from "commander"; import { rpc } from "@inlang/rpc"; -import { - getInlangProject, - settleLastUsedProjectFileQueue, -} from "../../utilities/getInlangProject.js"; +import { getInlangProject } from "../../utilities/getInlangProject.js"; import { log, logError } from "../../utilities/log.js"; import { saveProjectToDirectory, @@ -41,7 +38,6 @@ export const translate = new Command() logError(error); exitCode = 1; } finally { - await settleLastUsedProjectFileQueue(); process.exit(exitCode); } }); diff --git a/packages/cli/src/commands/validate/index.ts b/packages/cli/src/commands/validate/index.ts index ab07a274e6..59d8b89371 100644 --- a/packages/cli/src/commands/validate/index.ts +++ b/packages/cli/src/commands/validate/index.ts @@ -1,8 +1,5 @@ import { Command } from "commander"; -import { - getInlangProject, - settleLastUsedProjectFileQueue, -} from "../../utilities/getInlangProject.js"; +import { getInlangProject } from "../../utilities/getInlangProject.js"; import { log } from "../../utilities/log.js"; import { projectOption } from "../../utilities/globalFlags.js"; @@ -32,7 +29,6 @@ export async function validateCommandAction(args: { project: string }) { log.error(error); exitCode = 1; } finally { - await settleLastUsedProjectFileQueue(); process.exit(exitCode); } } diff --git a/packages/cli/src/main.ts b/packages/cli/src/main.ts index e0dfe1da83..d4cf614257 100644 --- a/packages/cli/src/main.ts +++ b/packages/cli/src/main.ts @@ -3,6 +3,7 @@ import { machine } from "./commands/machine/index.js"; import { plugin } from "./commands/plugin/index.js"; import { version } from "../package.json"; import { initErrorMonitoring } from "./services/error-monitoring/implementation.js"; +import { silenceKnownShutdownNoise } from "./services/error-monitoring/silenceKnownShutdownNoise.js"; import { validate } from "./commands/validate/index.js"; import { capture } from "./telemetry/capture.js"; import { lastUsedProject } from "./utilities/getInlangProject.js"; @@ -11,6 +12,7 @@ import { lint } from "./commands/lint/index.js"; // --------------- INIT --------------- initErrorMonitoring(); +silenceKnownShutdownNoise(); // checks whether the gitOrigin corresponds to the pattern // beautiful logging diff --git a/packages/cli/src/services/error-monitoring/silenceKnownShutdownNoise.ts b/packages/cli/src/services/error-monitoring/silenceKnownShutdownNoise.ts new file mode 100644 index 0000000000..cca60c856c --- /dev/null +++ b/packages/cli/src/services/error-monitoring/silenceKnownShutdownNoise.ts @@ -0,0 +1,31 @@ +const FILE_QUEUE_CONTEXT_PATTERN = /(file queue|Error processing file queue entry)/i; +const DB_CLOSED_PATTERN = /(DB has been closed|driver has already been destroyed)/i; + +function shouldSilenceConsoleError(args: unknown[]): boolean { + if (args.length === 0) { + return false; + } + + const text = args + .map((arg) => { + if (arg instanceof Error) { + return `${arg.name}: ${arg.message}`; + } + return String(arg); + }) + .join(" "); + + return FILE_QUEUE_CONTEXT_PATTERN.test(text) && DB_CLOSED_PATTERN.test(text); +} + +export function silenceKnownShutdownNoise(): void { + const originalConsoleError = console.error.bind(console); + + console.error = (...args: unknown[]) => { + if (shouldSilenceConsoleError(args)) { + return; + } + + originalConsoleError(...args); + }; +} diff --git a/packages/cli/src/utilities/getInlangProject.ts b/packages/cli/src/utilities/getInlangProject.ts index e6adbe801d..8086397257 100644 --- a/packages/cli/src/utilities/getInlangProject.ts +++ b/packages/cli/src/utilities/getInlangProject.ts @@ -1,6 +1,5 @@ import fs from "node:fs"; import { loadProjectFromDirectory, type InlangProject } from "@inlang/sdk"; -import { fileQueueSettled } from "@inlang/sdk/lix"; import { resolve } from "node:path"; /** @@ -31,14 +30,3 @@ export async function getInlangProject(args: { process.exit(1); } } - -export async function settleLastUsedProjectFileQueue(): Promise { - if (!lastUsedProject) { - return; - } - try { - await fileQueueSettled({ lix: lastUsedProject.lix }); - } catch { - // Best-effort: ignore queue settle failures during shutdown. - } -}