From 5a91eca20de00dfc680e17f6cb4e2cae62d6534f Mon Sep 17 00:00:00 2001 From: Pengoose Date: Tue, 13 May 2025 03:52:58 +0900 Subject: [PATCH] fix(vitest): adjust `getWorkerMemoryLimit` priority for vmForks (#7960) --- packages/vitest/src/node/pools/vmForks.ts | 2 +- packages/vitest/src/node/pools/vmThreads.ts | 2 +- packages/vitest/src/utils/memory-limit.ts | 25 +++++++---- test/core/test/memory-limit.test.ts | 46 +++++++++++++++++++++ 4 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 test/core/test/memory-limit.test.ts diff --git a/packages/vitest/src/node/pools/vmForks.ts b/packages/vitest/src/node/pools/vmForks.ts index 2b5934ff0..ca73cf9e0 100644 --- a/packages/vitest/src/node/pools/vmForks.ts +++ b/packages/vitest/src/node/pools/vmForks.ts @@ -213,7 +213,7 @@ export function createVmForksPool( function getMemoryLimit(config: ResolvedConfig) { const memory = nodeos.totalmem() - const limit = getWorkerMemoryLimit(config) + const limit = getWorkerMemoryLimit(config, 'vmForks') if (typeof memory === 'number') { return stringToBytes(limit, config.watch ? memory / 2 : memory) diff --git a/packages/vitest/src/node/pools/vmThreads.ts b/packages/vitest/src/node/pools/vmThreads.ts index 72478992f..e53240829 100644 --- a/packages/vitest/src/node/pools/vmThreads.ts +++ b/packages/vitest/src/node/pools/vmThreads.ts @@ -206,7 +206,7 @@ export function createVmThreadsPool( function getMemoryLimit(config: ResolvedConfig) { const memory = nodeos.totalmem() - const limit = getWorkerMemoryLimit(config) + const limit = getWorkerMemoryLimit(config, 'vmThreads') if (typeof memory === 'number') { return stringToBytes(limit, config.watch ? memory / 2 : memory) diff --git a/packages/vitest/src/utils/memory-limit.ts b/packages/vitest/src/utils/memory-limit.ts index 25b0808ec..f35e7c51d 100644 --- a/packages/vitest/src/utils/memory-limit.ts +++ b/packages/vitest/src/utils/memory-limit.ts @@ -19,18 +19,25 @@ function getDefaultThreadsCount(config: ResolvedConfig) { : Math.max(numCpus - 1, 1) } -export function getWorkerMemoryLimit(config: ResolvedConfig): string | number { - const memoryLimit = config.poolOptions?.vmThreads?.memoryLimit +export function getWorkerMemoryLimit(config: ResolvedConfig, pool: 'vmThreads' | 'vmForks'): string | number { + if (pool === 'vmForks') { + const opts = config.poolOptions?.vmForks ?? {} + if (opts.memoryLimit) { + return opts.memoryLimit + } + const workers = opts.maxForks ?? getDefaultThreadsCount(config) - if (memoryLimit) { - return memoryLimit + return 1 / workers } + else { + const opts = config.poolOptions?.vmThreads ?? {} + if (opts.memoryLimit) { + return opts.memoryLimit + } + const workers = opts.maxThreads ?? getDefaultThreadsCount(config) - return ( - 1 - / (config.poolOptions?.vmThreads?.maxThreads - ?? getDefaultThreadsCount(config)) - ) + return 1 / workers + } } /** diff --git a/test/core/test/memory-limit.test.ts b/test/core/test/memory-limit.test.ts new file mode 100644 index 000000000..b8f3b6d35 --- /dev/null +++ b/test/core/test/memory-limit.test.ts @@ -0,0 +1,46 @@ +import type { PoolOptions, ResolvedConfig } from 'vitest/node' +import { describe, expect, it } from 'vitest' +import { getWorkerMemoryLimit } from 'vitest/src/utils/memory-limit.js' + +function makeConfig(poolOptions: PoolOptions): ResolvedConfig { + return { + poolOptions: { + vmForks: { + maxForks: poolOptions.maxForks, + memoryLimit: poolOptions.memoryLimit, + }, + vmThreads: { + maxThreads: poolOptions.maxThreads, + memoryLimit: poolOptions.memoryLimit, + }, + }, + } as ResolvedConfig +} + +describe('getWorkerMemoryLimit', () => { + it('should prioritize vmThreads.memoryLimit when pool is vmThreads', () => { + const config = { + poolOptions: { + vmForks: { memoryLimit: undefined }, + vmThreads: { memoryLimit: '256MB' }, + }, + } as ResolvedConfig + + expect(getWorkerMemoryLimit(config, 'vmThreads')).toBe('256MB') + }) + + it('should prioritize vmForks.memoryLimit when pool is vmForks', () => { + const config = makeConfig({ memoryLimit: '512MB' }) + expect(getWorkerMemoryLimit(config, 'vmForks')).toBe('512MB') + }) + + it('should calculate 1/maxThreads when vmThreads.memoryLimit is unset', () => { + const config = makeConfig({ maxThreads: 4 }) + expect(getWorkerMemoryLimit(config, 'vmThreads')).toBe(1 / 4) + }) + + it('should calculate 1/maxForks when vmForks.memoryLimit is unset', () => { + const config = makeConfig({ maxForks: 4 }) + expect(getWorkerMemoryLimit(config, 'vmForks')).toBe(1 / 4) + }) +}) -- 2.51.2