Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[18.x] vm: backport vm-related fixes #51004

Closed
wants to merge 22 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a6524dd
deps: V8: cherry-pick c400af48b5ef
joyeecheung Dec 1, 2023
990caf3
deps: V8: cherry-pick 7f5daed62d47
joyeecheung Dec 1, 2023
8ade4aa
deps: V8: cherry-pick 9a98f96b6d68
joyeecheung Dec 1, 2023
80f54b7
deps: V8: cherry-pick 94e8282325a1
joyeecheung Dec 1, 2023
213e73b
deps: V8: cherry-pick 3dd9576ce336
joyeecheung Dec 1, 2023
0f33b00
deps: V8: cherry-pick 1fada6b36f8d
joyeecheung Dec 1, 2023
59cf71f
deps: V8: cherry-pick 705e374124ae
joyeecheung Dec 1, 2023
86d8b58
deps: V8: cherry-pick 71ff68830279
joyeecheung Dec 1, 2023
c8ed93a
lib: fix compileFunction throws range error for negative numbers
MrJithil Oct 6, 2023
f1251ef
src: cast v8::Object::GetInternalField() return value to v8::Value
joyeecheung Aug 2, 2023
af9edb4
deps: add v8::Object::SetInternalFieldForNodeCore()
joyeecheung Sep 26, 2023
9e8629c
src: set ModuleWrap internal fields only once
joyeecheung Sep 8, 2023
bb3462a
module: use symbol in WeakMap to manage host defined options
joyeecheung Jun 21, 2023
05778c4
module: fix leak of vm.SyntheticModule
joyeecheung Jun 21, 2023
0849599
module: fix the leak in SourceTextModule and ContextifySript
joyeecheung Jun 23, 2023
2feffae
test: add checkIfCollectable to test/common/gc.js
joyeecheung Sep 16, 2023
466c304
test: use checkIfCollectable in vm leak tests
joyeecheung Sep 16, 2023
fc003be
test: deflake test-vm-contextified-script-leak
joyeecheung Sep 23, 2023
d183187
vm: use default HDO when importModuleDynamically is not set
joyeecheung Oct 5, 2023
c8be386
vm: unify host-defined option generation in vm.compileFunction
joyeecheung Oct 5, 2023
222877e
vm: use internal versions of compileFunction and Script
joyeecheung Oct 11, 2023
a2b3f6e
vm: reject in importModuleDynamically without --experimental-vm-modules
joyeecheung Oct 5, 2023
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
Prev Previous commit
Next Next commit
test: add checkIfCollectable to test/common/gc.js
PR-URL: #49671
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
  • Loading branch information
joyeecheung committed Dec 1, 2023
commit 2feffae731a3e5c876bf9862c1a937c6c98bb4ad
70 changes: 70 additions & 0 deletions test/common/gc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
'use strict';

// TODO(joyeecheung): merge ongc.js and gcUntil from common/index.js
// into this.

// This function can be used to check if an object factor leaks or not,
// but it needs to be used with care:
// 1. The test should be set up with an ideally small
// --max-old-space-size or --max-heap-size, which combined with
// the maxCount parameter can reproduce a leak of the objects
// created by fn().
// 2. This works under the assumption that if *none* of the objects
// created by fn() can be garbage-collected, the test would crash due
// to OOM.
// 3. If *any* of the objects created by fn() can be garbage-collected,
// it is considered leak-free. The FinalizationRegistry is used to
// terminate the test early once we detect any of the object is
// garbage-collected to make the test less prone to false positives.
// This may be especially important for memory management relying on
// emphemeron GC which can be inefficient to deal with extremely fast
// heap growth.
// Note that this can still produce false positives. When the test using
// this function still crashes due to OOM, inspect the heap to confirm
// if a leak is present (e.g. using heap snapshots).
// The generateSnapshotAt parameter can be used to specify a count
// interval to create the heap snapshot which may enforce a more thorough GC.
// This can be tried for code paths that require it for the GC to catch up
// with heap growth. However this type of forced GC can be in conflict with
// other logic in V8 such as bytecode aging, and it can slow down the test
// significantly, so it should be used scarcely and only as a last resort.
async function checkIfCollectable(
fn, maxCount = 4096, generateSnapshotAt = Infinity, logEvery = 128) {
let anyFinalized = false;
let count = 0;

const f = new FinalizationRegistry(() => {
anyFinalized = true;
});

async function createObject() {
const obj = await fn();
f.register(obj);
if (count++ < maxCount && !anyFinalized) {
setImmediate(createObject, 1);
}
// This can force a more thorough GC, but can slow the test down
// significantly in a big heap. Use it with care.
if (count % generateSnapshotAt === 0) {
// XXX(joyeecheung): This itself can consume a bit of JS heap memory,
// but the other alternative writeHeapSnapshot can run into disk space
// not enough problems in the CI & be slower depending on file system.
// Just do this for now as long as it works and only invent some
// internal voodoo when we absolutely have no other choice.
require('v8').getHeapSnapshot().pause().read();
console.log(`Generated heap snapshot at ${count}`);
}
if (count % logEvery === 0) {
console.log(`Created ${count} objects`);
}
if (anyFinalized) {
console.log(`Found finalized object at ${count}, stop testing`);
}
}

createObject();
}

module.exports = {
checkIfCollectable,
};