test: give more time to GC in test-shadow-realm-gc-*

When --node-builtin-modules-path is used, we read and create
new strings for builtins in each realm which increases the memory
usage. As a result GC may not be able to keep up with the
allocation done in the loop in the test.

As a workaround, give GC a bit more time by waiting for a timer
in the loop.

PR-URL: https://github.com/nodejs/node/pull/50735
Refs: https://github.com/nodejs/node/issues/50726
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
This commit is contained in:
Joyee Cheung committed 2023-11-17 16:09:30 +01:00
1 parent 7a5c2d4be6
commit c5eb2c4190
3 files changed
+21 -10

No files matched your search

+11
View File
@@ -1,5 +1,7 @@
'use strict';
const wait = require('timers/promises').setTimeout;
// TODO(joyeecheung): merge ongc.js and gcUntil from common/index.js
// into this.
@@ -65,6 +67,15 @@ async function checkIfCollectable(
createObject();
}
// Repeat an operation and give GC some breathing room at every iteration.
async function runAndBreathe(fn, repeat, waitTime = 20) {
for (let i = 0; i < repeat; i++) {
await fn();
await wait(waitTime);
}
}
module.exports = {
checkIfCollectable,
runAndBreathe,
};
+6 -8
View File
@@ -8,13 +8,11 @@
const common = require('../common');
const fixtures = require('../common/fixtures');
const { runAndBreathe } = require('../common/gc');
async function main() {
const mod = fixtures.fileURL('es-module-shadow-realm', 'state-counter.mjs');
for (let i = 0; i < 100; i++) {
const realm = new ShadowRealm();
await realm.importValue(mod, 'getCounter');
}
}
const mod = fixtures.fileURL('es-module-shadow-realm', 'state-counter.mjs');
main().then(common.mustCall());
runAndBreathe(async () => {
const realm = new ShadowRealm();
await realm.importValue(mod, 'getCounter');
}, 100).then(common.mustCall());
+4 -2
View File
@@ -6,14 +6,16 @@
*/
const common = require('../common');
const { runAndBreathe } = require('../common/gc');
const assert = require('assert');
const { isMainThread, Worker } = require('worker_threads');
for (let i = 0; i < 100; i++) {
runAndBreathe(() => {
const realm = new ShadowRealm();
realm.evaluate('new TextEncoder(); 1;');
}
}, 100).then(common.mustCall());
// Test it in worker too.
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('exit', common.mustCall((code) => {