Summary
On a constrained CI runner (GitHub ubuntu-24.04-arm), vp run <task> fails with:
✗ Failed to spawn process: Resource temporarily unavailable (os error 11)
os error 11 is EAGAIN, the OS refusing a new process/thread because a per-user limit (RLIMIT_NPROC, which counts threads) is exhausted. This started after upgrading to vite-plus 0.2.2.
Where it comes from
The failing task is a plain Node script with no vite-plus/native import:
'i18n:check': { command: 'node scripts/compare-translations.ts' }
The script itself runs to completion (it prints thousands of lines of output); the failure is raised by the vp run wrapper's native runtime. Two independent changes each make it pass, which points at vp run's per-task cache bookkeeping:
- cache: false on the task → passes.
- Running the command directly (node scripts/compare-translations.ts, bypassing vp run) → passes.
Ruled out:
- Not the task's work: the script exits 0 and writes nothing extra.
- Not cross-task concurrency: it fails even when the task runs alone (serialized).
- Not the rayon pool: RAYON_NUM_THREADS=2 and ROLLDOWN_MAX_BLOCKING_THREADS=2 did not help.
So the cache path appears to spawn a CPU-sized (or unbounded) set of threads/processes to hash inputs/outputs, and hard-fails with EAGAIN when the runner's RLIMIT_NPROC is low.
Expected
vp run's cache bookkeeping should stay within a bounded thread/process count and degrade gracefully (or fall back to running uncached) instead of aborting with a hard EAGAIN. Ideally expose a knob to cap the worker count.
Environment
- vite-plus / vp: 0.2.2
- Runner: GitHub Actions ubuntu-24.04-arm
- Node: lts/* (24)
Repro / evidence (in npmx.dev)
Workaround
Set cache: false on the affected task (also appropriate here since the audit script writes files, so caching never helped).
Summary
On a constrained CI runner (GitHub ubuntu-24.04-arm), vp run <task> fails with:
os error 11 is EAGAIN, the OS refusing a new process/thread because a per-user limit (RLIMIT_NPROC, which counts threads) is exhausted. This started after upgrading to vite-plus 0.2.2.
Where it comes from
The failing task is a plain Node script with no vite-plus/native import:
The script itself runs to completion (it prints thousands of lines of output); the failure is raised by the vp run wrapper's native runtime. Two independent changes each make it pass, which points at vp run's per-task cache bookkeeping:
Ruled out:
So the cache path appears to spawn a CPU-sized (or unbounded) set of threads/processes to hash inputs/outputs, and hard-fails with EAGAIN when the runner's RLIMIT_NPROC is low.
Expected
vp run's cache bookkeeping should stay within a bounded thread/process count and degrade gracefully (or fall back to running uncached) instead of aborting with a hard EAGAIN. Ideally expose a knob to cap the worker count.
Environment
Repro / evidence (in npmx.dev)
Workaround
Set cache: false on the affected task (also appropriate here since the audit script writes files, so caching never helped).