mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
fix(test): tier local vitest worker defaults by host memory
This commit is contained in:
committed by
Nimrod Gutman
parent
2931e215ca
commit
420c18364e
@@ -93,6 +93,7 @@
|
|||||||
- Naming: match source names with `*.test.ts`; e2e in `*.e2e.test.ts`.
|
- Naming: match source names with `*.test.ts`; e2e in `*.e2e.test.ts`.
|
||||||
- Run `pnpm test` (or `pnpm test:coverage`) before pushing when you touch logic.
|
- Run `pnpm test` (or `pnpm test:coverage`) before pushing when you touch logic.
|
||||||
- Do not set test workers above 16; tried already.
|
- Do not set test workers above 16; tried already.
|
||||||
|
- If local Vitest runs cause memory pressure (common on non-Mac-Studio hosts), use `OPENCLAW_TEST_PROFILE=low OPENCLAW_TEST_SERIAL_GATEWAY=1 pnpm test` for land/gate runs.
|
||||||
- Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (OpenClaw-only) or `LIVE=1 pnpm test:live` (includes provider live tests). Docker: `pnpm test:docker:live-models`, `pnpm test:docker:live-gateway`. Onboarding Docker E2E: `pnpm test:docker:onboard`.
|
- Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (OpenClaw-only) or `LIVE=1 pnpm test:live` (includes provider live tests). Docker: `pnpm test:docker:live-models`, `pnpm test:docker:live-gateway`. Onboarding Docker E2E: `pnpm test:docker:onboard`.
|
||||||
- Full kit + what’s covered: `docs/testing.md`.
|
- Full kit + what’s covered: `docs/testing.md`.
|
||||||
- Changelog: user-facing changes only; no internal/meta notes (version alignment, appcast reminders, release process).
|
- Changelog: user-facing changes only; no internal/meta notes (version alignment, appcast reminders, release process).
|
||||||
|
|||||||
@@ -157,16 +157,21 @@ const testProfile =
|
|||||||
const overrideWorkers = Number.parseInt(process.env.OPENCLAW_TEST_WORKERS ?? "", 10);
|
const overrideWorkers = Number.parseInt(process.env.OPENCLAW_TEST_WORKERS ?? "", 10);
|
||||||
const resolvedOverride =
|
const resolvedOverride =
|
||||||
Number.isFinite(overrideWorkers) && overrideWorkers > 0 ? overrideWorkers : null;
|
Number.isFinite(overrideWorkers) && overrideWorkers > 0 ? overrideWorkers : null;
|
||||||
// Keep gateway serial on Windows CI and CI by default; run in parallel locally
|
const hostCpuCount = os.cpus().length;
|
||||||
// for lower wall-clock time. CI can opt in via OPENCLAW_TEST_PARALLEL_GATEWAY=1.
|
const hostMemoryGiB = Math.floor(os.totalmem() / 1024 ** 3);
|
||||||
|
// Keep aggressive local defaults for high-memory workstations (Mac Studio class).
|
||||||
|
const highMemLocalHost = !isCI && hostMemoryGiB >= 96;
|
||||||
|
const lowMemLocalHost = !isCI && hostMemoryGiB < 64;
|
||||||
|
const parallelGatewayEnabled =
|
||||||
|
process.env.OPENCLAW_TEST_PARALLEL_GATEWAY === "1" || (!isCI && highMemLocalHost);
|
||||||
|
// Keep gateway serial by default except when explicitly requested or on high-memory local hosts.
|
||||||
const keepGatewaySerial =
|
const keepGatewaySerial =
|
||||||
isWindowsCi ||
|
isWindowsCi ||
|
||||||
process.env.OPENCLAW_TEST_SERIAL_GATEWAY === "1" ||
|
process.env.OPENCLAW_TEST_SERIAL_GATEWAY === "1" ||
|
||||||
testProfile === "serial" ||
|
testProfile === "serial" ||
|
||||||
(isCI && process.env.OPENCLAW_TEST_PARALLEL_GATEWAY !== "1");
|
!parallelGatewayEnabled;
|
||||||
const parallelRuns = keepGatewaySerial ? runs.filter((entry) => entry.name !== "gateway") : runs;
|
const parallelRuns = keepGatewaySerial ? runs.filter((entry) => entry.name !== "gateway") : runs;
|
||||||
const serialRuns = keepGatewaySerial ? runs.filter((entry) => entry.name === "gateway") : [];
|
const serialRuns = keepGatewaySerial ? runs.filter((entry) => entry.name === "gateway") : [];
|
||||||
const hostCpuCount = os.cpus().length;
|
|
||||||
const baseLocalWorkers = Math.max(4, Math.min(16, hostCpuCount));
|
const baseLocalWorkers = Math.max(4, Math.min(16, hostCpuCount));
|
||||||
const loadAwareDisabledRaw = process.env.OPENCLAW_TEST_LOAD_AWARE?.trim().toLowerCase();
|
const loadAwareDisabledRaw = process.env.OPENCLAW_TEST_LOAD_AWARE?.trim().toLowerCase();
|
||||||
const loadAwareDisabled = loadAwareDisabledRaw === "0" || loadAwareDisabledRaw === "false";
|
const loadAwareDisabled = loadAwareDisabledRaw === "0" || loadAwareDisabledRaw === "false";
|
||||||
@@ -199,15 +204,29 @@ const defaultWorkerBudget =
|
|||||||
extensions: Math.max(1, Math.min(6, Math.floor(localWorkers / 2))),
|
extensions: Math.max(1, Math.min(6, Math.floor(localWorkers / 2))),
|
||||||
gateway: Math.max(1, Math.min(2, Math.floor(localWorkers / 4))),
|
gateway: Math.max(1, Math.min(2, Math.floor(localWorkers / 4))),
|
||||||
}
|
}
|
||||||
: {
|
: highMemLocalHost
|
||||||
// Local `pnpm test` runs multiple vitest groups concurrently;
|
? {
|
||||||
// bias workers toward unit-fast (wall-clock bottleneck) while
|
// High-memory local hosts can prioritize wall-clock speed.
|
||||||
// keeping unit-isolated low enough that both groups finish closer together.
|
unit: Math.max(4, Math.min(14, Math.floor((localWorkers * 7) / 8))),
|
||||||
unit: Math.max(4, Math.min(14, Math.floor((localWorkers * 7) / 8))),
|
unitIsolated: Math.max(1, Math.min(2, Math.floor(localWorkers / 6) || 1)),
|
||||||
unitIsolated: Math.max(1, Math.min(2, Math.floor(localWorkers / 6) || 1)),
|
extensions: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))),
|
||||||
extensions: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))),
|
gateway: Math.max(2, Math.min(4, Math.floor(localWorkers / 3))),
|
||||||
gateway: Math.max(2, Math.min(4, Math.floor(localWorkers / 3))),
|
}
|
||||||
};
|
: lowMemLocalHost
|
||||||
|
? {
|
||||||
|
// Sub-64 GiB local hosts are prone to OOM with large vmFork runs.
|
||||||
|
unit: 2,
|
||||||
|
unitIsolated: 1,
|
||||||
|
extensions: 1,
|
||||||
|
gateway: 1,
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
// 64-95 GiB local hosts: conservative split with some parallel headroom.
|
||||||
|
unit: Math.max(2, Math.min(8, Math.floor(localWorkers / 2))),
|
||||||
|
unitIsolated: 1,
|
||||||
|
extensions: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))),
|
||||||
|
gateway: 1,
|
||||||
|
};
|
||||||
|
|
||||||
// Keep worker counts predictable for local runs; trim macOS CI workers to avoid worker crashes/OOM.
|
// Keep worker counts predictable for local runs; trim macOS CI workers to avoid worker crashes/OOM.
|
||||||
// In CI on linux/windows, prefer Vitest defaults to avoid cross-test interference from lower worker counts.
|
// In CI on linux/windows, prefer Vitest defaults to avoid cross-test interference from lower worker counts.
|
||||||
|
|||||||
Reference in New Issue
Block a user