chore: pr feedbacks

This commit is contained in:
Nicolas Meienberger 2026-05-09 11:26:34 +02:00
parent e2498ff638
commit e4499c395f
No known key found for this signature in database
5 changed files with 30 additions and 13 deletions

View file

@ -90,7 +90,9 @@ const getActiveBackupRun = (jobId: string, scheduleId: string, eventName: string
} }
if (activeBackupRun.scheduleShortId !== scheduleId) { if (activeBackupRun.scheduleShortId !== scheduleId) {
logger.warn(`Ignoring ${eventName} for job ${jobId} due to schedule mismatch ${scheduleId} from agent ${agentId}`); logger.warn(
`Ignoring ${eventName} for job ${jobId} due to schedule mismatch ${scheduleId} from agent ${agentId}`,
);
return null; return null;
} }
@ -308,7 +310,9 @@ export const startLocalAgent = async () => {
await spawnLocalAgentProcess(runtime); await spawnLocalAgentProcess(runtime);
if (!runtime.agentManager) { if (!runtime.agentManager) {
return; throw new Error(
`startLocalAgent spawned ${LOCAL_AGENT_ID} via spawnLocalAgentProcess, but runtime.agentManager is missing; waitForAgentReady cannot check readiness`,
);
} }
if (!(await runtime.agentManager.waitForAgentReady(LOCAL_AGENT_ID))) { if (!(await runtime.agentManager.waitForAgentReady(LOCAL_AGENT_ID))) {

View file

@ -1,4 +1,4 @@
import { afterEach, describe, expect, test, vi } from "vitest"; import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
import { Scheduler } from "../../../core/scheduler"; import { Scheduler } from "../../../core/scheduler";
import * as bootstrapModule from "../bootstrap"; import * as bootstrapModule from "../bootstrap";
import { agentManager } from "../../agents/agents-manager"; import { agentManager } from "../../agents/agents-manager";
@ -12,8 +12,14 @@ const loadShutdownModule = async () => {
return import(moduleUrl.href); return import(moduleUrl.href);
}; };
let originalEnableLocalAgent: boolean;
beforeEach(() => {
originalEnableLocalAgent = config.flags.enableLocalAgent;
});
afterEach(() => { afterEach(() => {
config.flags.enableLocalAgent = true; config.flags.enableLocalAgent = originalEnableLocalAgent;
vi.restoreAllMocks(); vi.restoreAllMocks();
}); });
@ -28,7 +34,7 @@ describe("shutdown", () => {
}); });
const runVolumeCommand = vi.spyOn(agentManager, "runVolumeCommand"); const runVolumeCommand = vi.spyOn(agentManager, "runVolumeCommand");
await createTestVolume({ const volume = await createTestVolume({
name: "Shutdown test volume", name: "Shutdown test volume",
config: { config: {
backend: "directory", backend: "directory",
@ -47,6 +53,9 @@ describe("shutdown", () => {
expect(events).toEqual(["scheduler.stop", "agents.stop"]); expect(events).toEqual(["scheduler.stop", "agents.stop"]);
expect(runVolumeCommand).not.toHaveBeenCalled(); expect(runVolumeCommand).not.toHaveBeenCalled();
const updated = await db.query.volumesTable.findFirst({ where: { id: volume.id } });
expect(updated).toBeDefined();
expect(updated!.status).toBe("mounted");
}); });
test("keeps legacy controller-local fallback unmount on shutdown", async () => { test("keeps legacy controller-local fallback unmount on shutdown", async () => {
@ -58,6 +67,9 @@ describe("shutdown", () => {
vi.spyOn(bootstrapModule, "stopApplicationRuntime").mockImplementation(async () => { vi.spyOn(bootstrapModule, "stopApplicationRuntime").mockImplementation(async () => {
events.push("agents.stop"); events.push("agents.stop");
}); });
const runVolumeCommand = vi.spyOn(agentManager, "runVolumeCommand").mockImplementation(async () => {
throw new Error("runVolumeCommand should not be called during fallback shutdown");
});
const volume = await createTestVolume({ const volume = await createTestVolume({
name: "Fallback shutdown test volume", name: "Fallback shutdown test volume",
@ -71,6 +83,8 @@ describe("shutdown", () => {
const updated = await db.query.volumesTable.findFirst({ where: { id: volume.id } }); const updated = await db.query.volumesTable.findFirst({ where: { id: volume.id } });
expect(events).toEqual(["scheduler.stop", "agents.stop"]); expect(events).toEqual(["scheduler.stop", "agents.stop"]);
expect(updated?.status).toBe("unmounted"); expect(runVolumeCommand).not.toHaveBeenCalled();
expect(updated).toBeDefined();
expect(updated!.status).toBe("unmounted");
}); });
}); });

View file

@ -70,7 +70,6 @@ const volumeForAgent = async (volume: Volume): Promise<Volume> => ({
const volumeForHost = async (volume: Volume): Promise<AgentVolume> => ({ const volumeForHost = async (volume: Volume): Promise<AgentVolume> => ({
...volume, ...volume,
shortId: volume.shortId,
config: await decryptVolumeConfig(volume.config), config: await decryptVolumeConfig(volume.config),
provisioningId: volume.provisioningId ?? null, provisioningId: volume.provisioningId ?? null,
}); });
@ -211,7 +210,7 @@ const getVolume = async (shortId: ShortId) => {
let statfs: Partial<StatFs> = {}; let statfs: Partial<StatFs> = {};
if (volume.status === "mounted") { if (volume.status === "mounted") {
statfs = await withTimeout( statfs = await withTimeout(
!shouldUseControllerLocalVolumeFallback(volume) shouldRunViaAgent(volume)
? runVolumeCommand(volume.agentId, { ? runVolumeCommand(volume.agentId, {
name: "volume.statfs", name: "volume.statfs",
volume: await volumeForAgent(volume), volume: await volumeForAgent(volume),

View file

@ -36,7 +36,7 @@ afterEach(() => {
}); });
const runVolumeCommand = async (payload: VolumeCommandPayload) => { const runVolumeCommand = async (payload: VolumeCommandPayload) => {
const outboundMessages: string[] = []; const outboundMessages: AgentWireMessage[] = [];
const context = fromPartial<ControllerCommandContext>({ const context = fromPartial<ControllerCommandContext>({
offerOutbound: (message: AgentWireMessage) => offerOutbound: (message: AgentWireMessage) =>
Effect.sync(() => { Effect.sync(() => {

View file

@ -7,8 +7,8 @@ let tempRoot: string | undefined;
let mockMountPoints: string[] = []; let mockMountPoints: string[] = [];
afterEach(async () => { afterEach(async () => {
vi.doUnmock("./constants"); vi.doUnmock("../constants");
vi.doUnmock("./fs"); vi.doUnmock("../fs");
vi.resetModules(); vi.resetModules();
mockMountPoints = []; mockMountPoints = [];
if (tempRoot) { if (tempRoot) {
@ -20,8 +20,8 @@ afterEach(async () => {
const loadCleanup = async () => { const loadCleanup = async () => {
vi.resetModules(); vi.resetModules();
tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "zerobyte-agent-cleanup-")); tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "zerobyte-agent-cleanup-"));
vi.doMock("./constants", () => ({ VOLUME_MOUNT_BASE: tempRoot })); vi.doMock("../constants", () => ({ VOLUME_MOUNT_BASE: tempRoot }));
vi.doMock("./fs", () => ({ vi.doMock("../fs", () => ({
readMountInfo: async () => mockMountPoints.map((mountPoint) => ({ mountPoint, fstype: "fuse.sshfs" })), readMountInfo: async () => mockMountPoints.map((mountPoint) => ({ mountPoint, fstype: "fuse.sshfs" })),
})); }));