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

AbortSignal.any() causes memory leak #54614

Open
Furzel opened this issue Aug 28, 2024 · 4 comments
Open

AbortSignal.any() causes memory leak #54614

Furzel opened this issue Aug 28, 2024 · 4 comments
Labels
abortcontroller Issues and PRs related to the AbortController API memory Issues and PRs related to the memory management or memory footprint.

Comments

@Furzel
Copy link

Furzel commented Aug 28, 2024

Version

v22.6.0

Platform

Microsoft Windows NT 10.0.22631.0 x64
Linux ****** 4.4.0-22621-Microsoft #3672-Microsoft Fri Jan 01 08:00:00 PST 2016 x86_64 x86_64 x86_64 GNU/Linux

Subsystem

https://nodejs.org/api/globals.html#class-abortsignal

What steps will reproduce the bug?

Run this and watch memory usage.

const formatMemoryUsage = (data) => `${Math.round(data / 1024 / 1024 * 100) / 100} MB`;

let memoryData = process.memoryUsage();
console.log('Mem before loop', formatMemoryUsage(memoryData.rss));

for (let i = 0; true; i++) {
    const abortController = new AbortController();
    const signal = abortController.signal;
    const composedSignal = AbortSignal.any([signal]);

    if (i === 1000000) {
        break;
    }
}

memoryData = process.memoryUsage();
console.log('Mem after 1 million iteration', formatMemoryUsage(memoryData.rss));

This is what I get on my local machine
image

How often does it reproduce? Is there a required condition?

Always reproducible as far as I can tell

What is the expected behavior? Why is that the expected behavior?

Memory post loop execution should be fairly equivalent to the first log but somehow the const composedSignal = AbortSignal.any([signal]); does not get cleaned up from memory, I would expect this to get cleaned properly or if this is the intended behavior to have a clear warning in the documentation.

What do you see instead?

We see a memory leak that will eventually lead to an out of memory error.

Additional information

This has been tested on Node 22.6 on different machine and both Windows + Unix versions. Happy to provide more details if needed

@kallerosenbaum
Copy link

This might (I'm not sure) be a duplicate of #48419

@RedYetiDev RedYetiDev added abortcontroller Issues and PRs related to the AbortController API repro-exists labels Aug 28, 2024
@RedYetiDev
Copy link
Member

$ node repro.js 
Mem before loop 44.25 MB
Mem after 1 million iteration 1375.11 MB

@geeksilva97
Copy link
Contributor

I started taking some snapshot

image image

@RedYetiDev would you have any clue?

@RedYetiDev RedYetiDev added the memory Issues and PRs related to the memory management or memory footprint. label Sep 25, 2024
@mika-fischer
Copy link
Contributor

I think the issue here is that everything is happening in the same tick. This does not leak for me:

const formatMemoryUsage = (data) => `${Math.round((data / 1024 / 1024) * 100) / 100} MB`;

let memoryData = process.memoryUsage();
console.log('Mem before loop', formatMemoryUsage(memoryData.rss));

let i = 0;
function run() {
    const abortController = new AbortController();
    const signal = abortController.signal;
    const composedSignal = AbortSignal.any([signal]);

    if (i === 1000000) {
        memoryData = process.memoryUsage();
        console.log('Mem after 1 million iteration', formatMemoryUsage(memoryData.rss));
    } else {
        i++;
        setImmediate(run);
    }
}

run();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
abortcontroller Issues and PRs related to the AbortController API memory Issues and PRs related to the memory management or memory footprint.
Projects
None yet
Development

No branches or pull requests

6 participants