fix: make gateway nodes and local inference reliable under stress (#115185)

This commit is contained in:
Peter Steinberger
2026-07-28 08:41:14 -04:00
committed by GitHub
parent 6d4e7b765c
commit 107bc4f963
13 changed files with 184 additions and 15 deletions
+25
View File
@@ -200,6 +200,31 @@ describe("runNodeDaemonStatus", () => {
mocks.service.readRuntime.mockReset().mockResolvedValue({ status: "running" });
});
it("reports a failed service check instead of claiming the node is not installed", async () => {
mocks.service.isLoaded.mockRejectedValue(new Error("systemd unavailable"));
await runNodeDaemonStatus();
expect(mocks.runtime.error).toHaveBeenCalledWith(
"Node service check failed: Error: systemd unavailable",
);
expect(mocks.runtime.exit).toHaveBeenCalledWith(1);
expect(stdout()).not.toContain("not loaded");
expect(stdout()).not.toContain("openclaw node install");
});
it("reports a failed service check as JSON without inventing node status", async () => {
mocks.service.isLoaded.mockRejectedValue(new Error("systemd unavailable"));
await runNodeDaemonStatus({ json: true });
expect(mocks.runtime.writeJson).toHaveBeenCalledWith({
error: "Node service check failed: Error: systemd unavailable",
});
expect(mocks.runtime.exit).toHaveBeenCalledWith(1);
expect(mocks.runtime.error).not.toHaveBeenCalled();
});
it("keeps missing service-unit status on stderr and prints recovery hints on stdout", async () => {
mocks.service.readRuntime.mockResolvedValue({ status: "stopped", missingUnit: true });
+14 -2
View File
@@ -215,8 +215,20 @@ export async function runNodeDaemonStop(opts: NodeDaemonLifecycleOptions = {}) {
export async function runNodeDaemonStatus(opts: NodeDaemonStatusOptions = {}) {
const json = Boolean(opts.json);
const service = resolveNodeService();
const [loaded, command, runtime] = await Promise.all([
service.isLoaded({ env: process.env }).catch(() => false),
let loaded: boolean;
try {
loaded = await service.isLoaded({ env: process.env });
} catch (error) {
const message = `Node service check failed: ${String(error)}`;
if (json) {
defaultRuntime.writeJson({ error: message });
} else {
defaultRuntime.error(message);
}
defaultRuntime.exit(1);
return;
}
const [command, runtime] = await Promise.all([
service.readCommand(process.env).catch(() => null),
service
.readRuntime(process.env)