fix: await flushDirtyEntries during shutdown to prevent usage data loss
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled

Remove fire-and-forget SIGTERM/SIGINT handlers from usage.ts (race condition
with pool.end() in index.ts). Instead, await flushDirtyEntries() in the
index.ts shutdown orchestrator between stopping the server and closing the
DB pool.
This commit is contained in:
OpenClaw 2026-03-07 08:03:56 +01:00
parent b964b98a8b
commit 2b4fa0c690
3 changed files with 41 additions and 4 deletions

View file

@ -0,0 +1,30 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
vi.unmock("../middleware/usage.js");
describe("usage shutdown race condition fix", () => {
it("should NOT register SIGTERM/SIGINT handlers as module-level side effects", async () => {
const onSpy = vi.spyOn(process, "on");
vi.resetModules();
// Track which signals usage.ts registers
const signalsBefore = onSpy.mock.calls.map(c => c[0]);
await import("../middleware/usage.js");
const signalsAfter = onSpy.mock.calls.map(c => c[0]);
const newSignals = signalsAfter.slice(signalsBefore.length);
// usage.ts should NOT register SIGTERM or SIGINT handlers
const usageSignals = newSignals.filter(s => s === "SIGTERM" || s === "SIGINT");
expect(usageSignals).toEqual([]);
onSpy.mockRestore();
});
it("should export flushDirtyEntries for external shutdown orchestration", async () => {
vi.resetModules();
const usageMod = await import("../middleware/usage.js");
expect(typeof usageMod.flushDirtyEntries).toBe("function");
});
});