fix(test): cap native worker pools for serial Vitest · openclaw/openclaw@734748d
vincentkoc
·
2026-04-25
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -40,12 +40,42 @@ export function resolveVitestNoOutputTimeoutMs(env = process.env) {
|
40 | 40 | |
41 | 41 | export function resolveVitestSpawnParams(env = process.env, platform = process.platform) { |
42 | 42 | return { |
43 | | - env, |
| 43 | +env: resolveVitestSpawnEnv(env), |
44 | 44 | detached: shouldUseDetachedVitestProcessGroup(platform), |
45 | 45 | stdio: ["inherit", "pipe", "pipe"], |
46 | 46 | }; |
47 | 47 | } |
48 | 48 | |
| 49 | +export function resolveVitestSpawnEnv(env = process.env) { |
| 50 | +if (!shouldApplyNativeWorkerBudget(env)) { |
| 51 | +return env; |
| 52 | +} |
| 53 | + |
| 54 | +const nativeWorkerCount = String(resolveNativeWorkerCount(env)); |
| 55 | +return { |
| 56 | + ...env, |
| 57 | +RAYON_NUM_THREADS: env.RAYON_NUM_THREADS?.trim() || nativeWorkerCount, |
| 58 | +TOKIO_WORKER_THREADS: env.TOKIO_WORKER_THREADS?.trim() || nativeWorkerCount, |
| 59 | +}; |
| 60 | +} |
| 61 | + |
| 62 | +function shouldApplyNativeWorkerBudget(env) { |
| 63 | +if (env.RAYON_NUM_THREADS?.trim() && env.TOKIO_WORKER_THREADS?.trim()) { |
| 64 | +return false; |
| 65 | +} |
| 66 | +return ( |
| 67 | +env.OPENCLAW_TEST_PROJECTS_SERIAL === "1" || resolveExplicitVitestWorkerBudget(env) !== null |
| 68 | +); |
| 69 | +} |
| 70 | + |
| 71 | +function resolveNativeWorkerCount(env) { |
| 72 | +return Math.min(resolveExplicitVitestWorkerBudget(env) ?? 1, 4); |
| 73 | +} |
| 74 | + |
| 75 | +function resolveExplicitVitestWorkerBudget(env) { |
| 76 | +return parsePositiveInt(env.OPENCLAW_VITEST_MAX_WORKERS ?? env.OPENCLAW_TEST_WORKERS); |
| 77 | +} |
| 78 | + |
49 | 79 | export function shouldSuppressVitestStderrLine(line) { |
50 | 80 | return SUPPRESSED_VITEST_STDERR_PATTERNS.some((pattern) => line.includes(pattern)); |
51 | 81 | } |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -230,7 +230,11 @@ const TOOLING_SOURCE_TEST_TARGETS = new Map([
|
230 | 230 | ["scripts/lib/vitest-local-scheduling.mjs", ["test/scripts/vitest-local-scheduling.test.ts"]], |
231 | 231 | [ |
232 | 232 | "scripts/run-vitest.mjs", |
233 | | -["test/scripts/test-projects.test.ts", "test/scripts/vitest-local-scheduling.test.ts"], |
| 233 | +[ |
| 234 | +"test/scripts/run-vitest.test.ts", |
| 235 | +"test/scripts/test-projects.test.ts", |
| 236 | +"test/scripts/vitest-local-scheduling.test.ts", |
| 237 | +], |
234 | 238 | ], |
235 | 239 | ["scripts/run-oxlint.mjs", ["test/scripts/run-oxlint.test.ts"]], |
236 | 240 | ["scripts/test-extension-batch.mjs", ["test/scripts/test-extension.test.ts"]], |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -58,6 +58,40 @@ describe("scripts/run-vitest", () => {
|
58 | 58 | }); |
59 | 59 | }); |
60 | 60 | |
| 61 | +it("caps native Rust worker pools for serial Vitest runs", () => { |
| 62 | +expect( |
| 63 | +resolveVitestSpawnParams( |
| 64 | +{ |
| 65 | +OPENCLAW_TEST_PROJECTS_SERIAL: "1", |
| 66 | +PATH: "/usr/bin", |
| 67 | +}, |
| 68 | +"darwin", |
| 69 | +).env, |
| 70 | +).toMatchObject({ |
| 71 | +OPENCLAW_TEST_PROJECTS_SERIAL: "1", |
| 72 | +RAYON_NUM_THREADS: "1", |
| 73 | +TOKIO_WORKER_THREADS: "1", |
| 74 | +}); |
| 75 | +}); |
| 76 | + |
| 77 | +it("keeps explicit native Rust worker pool settings", () => { |
| 78 | +expect( |
| 79 | +resolveVitestSpawnParams( |
| 80 | +{ |
| 81 | +OPENCLAW_VITEST_MAX_WORKERS: "2", |
| 82 | +PATH: "/usr/bin", |
| 83 | +RAYON_NUM_THREADS: "8", |
| 84 | +TOKIO_WORKER_THREADS: "6", |
| 85 | +}, |
| 86 | +"darwin", |
| 87 | +).env, |
| 88 | +).toMatchObject({ |
| 89 | +OPENCLAW_VITEST_MAX_WORKERS: "2", |
| 90 | +RAYON_NUM_THREADS: "8", |
| 91 | +TOKIO_WORKER_THREADS: "6", |
| 92 | +}); |
| 93 | +}); |
| 94 | + |
61 | 95 | it("suppresses rolldown plugin timing noise while keeping other stderr intact", () => { |
62 | 96 | expect( |
63 | 97 | shouldSuppressVitestStderrLine( |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。