Skip to content

Commit 124087d

Browse files
authored
fix: waiting bundler cache write to disk (#87)
1 parent b2dd57f commit 124087d

2 files changed

Lines changed: 45 additions & 31 deletions

File tree

scripts/benchmark.ts

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ import color from 'picocolors';
1414
import pidusage from 'pidusage';
1515
import { markdownTable } from 'markdown-table';
1616
import { caseName } from '../shared/constants.mjs';
17-
import { getFileSizes, addRankingEmojis, shuffleArray } from './utils.ts';
17+
import {
18+
getFileSizes,
19+
addRankingEmojis,
20+
shuffleArray,
21+
sleep,
22+
} from './utils.ts';
1823

1924
process.env.CASE = caseName;
2025

@@ -34,8 +39,7 @@ type BenchmarkConfig = {
3439

3540
type DevServerResult = {
3641
time: number;
37-
rss: number;
38-
stopServer: () => void;
42+
stopServer: () => Promise<number>;
3943
};
4044

4145
type BuildResult = {
@@ -120,7 +124,6 @@ class BuildTool {
120124
private readonly startedRegex: RegExp;
121125
private readonly buildScript: string;
122126
private readonly binFilePath: string;
123-
private child?: ChildProcess;
124127

125128
constructor({
126129
name,
@@ -202,16 +205,36 @@ class BuildTool {
202205
logger.log(`stderr: ${data}`);
203206
});
204207

205-
const stopServer = function () {
206-
if (child.pid) {
207-
kill(child.pid);
208-
}
209-
};
210-
211208
return new Promise<DevServerResult>((resolve, reject) => {
212209
let startTime: number | null = null;
213210
let bundlerPid: number | null = null;
214-
let timeUsage: number | null = null;
211+
212+
const stopServer = async () => {
213+
if (!bundlerPid) {
214+
throw new Error('Bundler pid not found');
215+
}
216+
217+
const TIMEOUT = 30000;
218+
const start = Date.now();
219+
// wait bundler write cache to disk
220+
while (Date.now() - start < TIMEOUT) {
221+
const info = await pidusage(bundlerPid);
222+
// CPU idle
223+
if (info.cpu === 0) {
224+
break;
225+
}
226+
await sleep(200);
227+
}
228+
229+
const info = await pidusage(bundlerPid);
230+
const rssRaw = info.memory / 1024 / 1024;
231+
const rss = Math.round(rssRaw * 1000) / 1000;
232+
233+
if (child.pid) {
234+
kill(child.pid);
235+
}
236+
return rss;
237+
};
215238

216239
stdout.on('data', (data: Buffer) => {
217240
const text = data.toString();
@@ -232,22 +255,7 @@ class BuildTool {
232255
reject(new Error('Start time not found'));
233256
return;
234257
}
235-
if (timeUsage === null) {
236-
timeUsage = Date.now() - startTime;
237-
if (!bundlerPid) {
238-
reject(new Error('Bundler pid not found'));
239-
return;
240-
}
241-
pidusage(bundlerPid, function (err, info) {
242-
if (err) {
243-
reject(err);
244-
return;
245-
}
246-
const rssRaw = info.memory / 1024 / 1024;
247-
const rss = Math.round(rssRaw * 1000) / 1000;
248-
resolve({ time: timeUsage!, rss, stopServer });
249-
});
250-
}
258+
resolve({ time: Date.now() - startTime, stopServer });
251259
}
252260
});
253261

@@ -477,8 +485,7 @@ async function runDevBenchmark(
477485
}
478486

479487
buildTool.cleanCache();
480-
const { time, rss, stopServer } = await buildTool.startServer();
481-
metrics.devRSS = rss;
488+
const { time, stopServer } = await buildTool.startServer();
482489
const page: Page = await browser.newPage();
483490
const start = Date.now();
484491

@@ -592,7 +599,8 @@ async function runDevBenchmark(
592599
writeFileSync(rootFilePath, originalRootFileContent);
593600
writeFileSync(leafFilePath, originalLeafFileContent);
594601

595-
stopServer();
602+
const rss = await stopServer();
603+
metrics.devRSS = rss;
596604

597605
await coolDown();
598606
logger.success(color.dim(buildTool.name) + ' dev server closed');
@@ -636,7 +644,7 @@ async function runHotStartBenchmark(
636644

637645
await page.close();
638646

639-
stopServer();
647+
await stopServer();
640648

641649
await coolDown();
642650
logger.success(color.dim(buildTool.name) + ' dev server closed (hot start)');

scripts/utils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,9 @@ export function shuffleArray<T>(array: T[]) {
8181
}
8282
return array;
8383
}
84+
85+
export async function sleep(timeout: number) {
86+
return new Promise<void>((res) => {
87+
setTimeout(res, timeout);
88+
});
89+
}

0 commit comments

Comments
 (0)