Skip to content

Commit 08498f0

Browse files
authored
fix(pool): properly reuse the vm pool (#8758)
1 parent 2827eab commit 08498f0

File tree

9 files changed

+24
-31
lines changed

9 files changed

+24
-31
lines changed

packages/vitest/src/node/pool.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export function createPool(ctx: Vitest): ProcessPool {
123123
workerId: workerId++,
124124
},
125125
project,
126-
env: options.env,
126+
env: { ...options.env, ...project.config.env },
127127
execArgv: [...options.execArgv, ...project.config.execArgv],
128128
worker: pool,
129129
isolate: project.config.isolate,

packages/vitest/src/node/pools/pool.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -281,17 +281,6 @@ function isEqualRunner(runner: PoolRunner, task: PoolTask) {
281281
runner.worker.name === task.worker
282282
&& runner.project === task.project
283283
&& runner.environment === task.context.environment.name
284-
&& runner.worker.execArgv.every((arg, index) => task.execArgv[index] === arg)
285-
&& isEnvEqual(runner.worker.env, task.env)
284+
&& (!runner.worker.canReuse || runner.worker.canReuse(task))
286285
)
287286
}
288-
289-
function isEnvEqual(a: PoolOptions['env'], b: PoolTask['env']) {
290-
const keys = Object.keys(a)
291-
292-
if (keys.length !== Object.keys(b).length) {
293-
return false
294-
}
295-
296-
return keys.every(key => a[key] === b[key])
297-
}

packages/vitest/src/node/pools/types.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@ export interface PoolOptions {
1313
cacheFs?: boolean
1414
environment: string
1515
execArgv: string[]
16-
env: Record<string, string>
16+
env: Partial<NodeJS.ProcessEnv>
1717
}
1818

1919
export interface PoolWorker {
2020
readonly name: string
21-
readonly execArgv: string[]
22-
readonly env: Record<string, string>
2321
readonly reportMemory?: boolean
2422
readonly cacheFs?: boolean
2523

@@ -30,13 +28,20 @@ export interface PoolWorker {
3028

3129
start: () => Promise<void>
3230
stop: () => Promise<void>
31+
32+
/**
33+
* This is called on workers that already satisfy certain constraints:
34+
* - The task has the same project
35+
* - The task has the same environment
36+
*/
37+
canReuse?: (task: PoolTask) => boolean
3338
}
3439

3540
export interface PoolTask {
3641
worker: 'forks' | 'threads' | 'vmForks' | 'vmThreads' | (string & {})
3742
project: TestProject
3843
isolate: boolean
39-
env: Record<string, string>
44+
env: Partial<NodeJS.ProcessEnv>
4045
execArgv: string[]
4146
context: ContextRPC
4247
memoryLimit: number | null

packages/vitest/src/node/pools/workers/forksWorker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ const SIGKILL_TIMEOUT = 500 /** jest does 500ms by default, let's follow it */
1010
/** @experimental */
1111
export class ForksPoolWorker implements PoolWorker {
1212
public readonly name: string = 'forks'
13-
public readonly execArgv: string[]
14-
public readonly env: Record<string, string>
1513
public readonly cacheFs: boolean = true
1614

1715
protected readonly entrypoint: string
16+
protected execArgv: string[]
17+
protected env: Partial<NodeJS.ProcessEnv>
1818

1919
private _fork?: ChildProcess
2020

packages/vitest/src/node/pools/workers/threadsWorker.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import { Worker } from 'node:worker_threads'
55
/** @experimental */
66
export class ThreadsPoolWorker implements PoolWorker {
77
public readonly name: string = 'threads'
8-
public readonly execArgv: string[]
9-
public readonly env: Record<string, string>
8+
109
protected readonly entrypoint: string
10+
protected execArgv: string[]
11+
protected env: Partial<NodeJS.ProcessEnv>
1112

1213
private _thread?: Worker
1314

packages/vitest/src/node/pools/workers/typecheckWorker.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,11 @@ import { Typechecker } from '../../../typecheck/typechecker'
1313
/** @experimental */
1414
export class TypecheckPoolWorker implements PoolWorker {
1515
public readonly name: string = 'typecheck'
16-
public readonly execArgv: string[]
17-
public readonly env: Record<string, string>
1816
private readonly project: TestProject
1917

2018
private _eventEmitter = new EventEmitter()
2119

2220
constructor(options: PoolOptions) {
23-
this.execArgv = options.execArgv
24-
this.env = options.env
2521
this.project = options.project
2622
}
2723

@@ -33,6 +29,10 @@ export class TypecheckPoolWorker implements PoolWorker {
3329
// noop, onMessage handles it
3430
}
3531

32+
canReuse(): boolean {
33+
return true
34+
}
35+
3636
send(message: WorkerRequest): void {
3737
void onMessage(message, this.project).then((response) => {
3838
if (response) {

packages/vitest/src/node/pools/workers/vmForksWorker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ export class VmForksPoolWorker extends ForksPoolWorker {
99
protected readonly entrypoint: string
1010

1111
constructor(options: PoolOptions) {
12-
super({ ...options, execArgv: [...options.execArgv, '--experimental-vm-modules'] })
12+
super(options)
13+
this.execArgv.push('--experimental-vm-modules')
1314

1415
/** Loads {@link file://./../../../runtime/workers/vmForks.ts} */
1516
this.entrypoint = resolve(options.distPath, 'workers/vmForks.js')

packages/vitest/src/node/pools/workers/vmThreadsWorker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ export class VmThreadsPoolWorker extends ThreadsPoolWorker {
99
protected readonly entrypoint: string
1010

1111
constructor(options: PoolOptions) {
12-
super({ ...options, execArgv: [...options.execArgv, '--experimental-vm-modules'] })
12+
super(options)
13+
this.execArgv.push('--experimental-vm-modules')
1314

1415
/** Loads {@link file://./../../../runtime/workers/vmThreads.ts} */
1516
this.entrypoint = resolve(options.distPath, 'workers/vmThreads.js')

test/cli/fixtures/custom-pool/pool/custom-pool.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,9 @@ export class CustomRuntimeWorker implements PoolWorker {
2020
public readonly name = 'custom'
2121
private vitest: Vitest
2222
private customEvents = new EventEmitter()
23-
readonly execArgv: string[]
24-
readonly env: Record<string, string>
2523
private project: TestProject
2624

2725
constructor(options: PoolOptions, private settings: OptionsCustomPool) {
28-
this.execArgv = options.execArgv
29-
this.env = options.env
3026
this.vitest = options.project.vitest
3127
this.project = options.project
3228
}

0 commit comments

Comments
 (0)