Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/bench/lib.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ export async function until(fn, everyMs, stallMs) {
for (;;) {
const r = await fn();
if (r === true) return;
if (typeof r === "number" && r !== last) { last = r; deadline = Date.now() + stallMs; }
if (typeof r === "number" && Number.isFinite(r) && r !== last) { last = r; deadline = Date.now() + stallMs; }
if (Date.now() > deadline) throw new Error(`等超时:${Math.round(stallMs / 60000)} 分钟没有任何进展`);
await sleep(everyMs);
}
Expand Down
18 changes: 18 additions & 0 deletions scripts/bench/until-progress.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import assert from "node:assert/strict";
import { test, mock } from "node:test";
import { until } from "./lib.mjs";

test("NaN progress cannot keep renewing a stalled benchmark", async () => {
let now = 0;
let polls = 0;
mock.method(Date, "now", () => ++now);
try {
await assert.rejects(until(() => {
if (++polls > 10) throw new Error("poll guard reached");
return NaN;
}, 0, 3), /等超时/);
assert.ok(polls <= 10);
} finally {
mock.restoreAll();
}
});
Loading