events: remove weak listener for event target - #48952
Conversation
There was a problem hiding this comment.
Why not make this a separate, standalone function instead of adding it to the prototype (as a non-standard function)?
There was a problem hiding this comment.
good question, Because it accesses the instance internals and I want to make it close to the other remove listener 😄
There was a problem hiding this comment.
My general impression is that for web standards APIs, node tries to avoid exposing non-standard properties and functions.
There was a problem hiding this comment.
I don't plan to expose it as plain function, either extracting or use symbol as a key
There was a problem hiding this comment.
I'm thinking maybe just remove the while as we are sure that this exists unless there is some weird thing that can happen here...
There was a problem hiding this comment.
Is there a better way to test 🤔 feels like this could be flakey
There was a problem hiding this comment.
This is a good question but to reduce flakiness this test would be to not run in parallel with other tests, will move it to a different file
There was a problem hiding this comment.
this 100 sounds like a magic number which would not be truly reliable... (I don't have a better idea of how to test this though)
There was a problem hiding this comment.
Removed the test as it did not work for some reason...
There was a problem hiding this comment.
@rluvaton I wrote this in another conversation, but I feel it belongs here...
Maybe using a WeakRef[] etc we can ensure the values are gone after globalThis.gc();, instead of checking an increase in memory? (meaning add them wrapped by WeakRef into an array during the createALotOfAbortSignals setup)
There was a problem hiding this comment.
great idea, the test was added :)
There was a problem hiding this comment.
removed the test as it can be flaky and instead checked that the memory leak warning was not emitted...
|
Also cc @nodejs/events |
There was a problem hiding this comment.
I am not sure why this requires the async iife wrapper, or the sleeps
There was a problem hiding this comment.
without the sleep, the test would fail (as I assume the GC happen in a different thread when having more than 1 core)
There was a problem hiding this comment.
I used 10ms like the rest
There was a problem hiding this comment.
increased to 100ms and hope the test now pass
There was a problem hiding this comment.
I replaced the test with another one that check that the memory leak warning not emitted which would be faster and have the same result
|
@rluvaton the test seems to be failing 😕 not ok 244 parallel/test-abortcontroller
---
duration_ms: 244.52900
severity: fail
exitcode: 1
stack: |-
node:internal/process/promises:289
triggerUncaughtException(err, true /* fromPromise */);
^
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ AbortSignal {
+ [Symbol(events.maxEventTargetListeners)]: 10,
+ [Symbol(events.maxEventTargetListenersWarned)]: false,
+ [Symbol(kAborted)]: false,
+ [Symbol(kComposite)]: false,
+ [Symbol(kEvents)]: SafeMap(1) [Map] {
+ 'abort' => <ref *1> {
+ next: Listener {
+ callback: SafeWeakRef [WeakRef] {},
+ flags: 81,
+ listener: SafeWeakRef [WeakRef] {},
+ next: undefined,
+ previous: [Circular *1]
+ },
+ resistStopPropagation: true,
+ size: 1
+ }
+ },
+ [Symbol(kHandlers)]: SafeMap(0) [Map] {},
+ [Symbol(kReason)]: undefined,
+ [Symbol(kTimeout)]: true
+ }
- undefined
at /home/iojs/build/workspace/node-test-commit-linux/test/parallel/test-abortcontroller.js:256:5 {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: AbortSignal {
[Symbol(kEvents)]: SafeMap(1) [Map] {
'abort' => <ref *1> {
size: 1,
next: Listener {
next: undefined,
previous: [Circular *1],
listener: SafeWeakRef [WeakRef] {},
flags: 81,
callback: SafeWeakRef [WeakRef] {}
},
resistStopPropagation: true
}
},
[Symbol(events.maxEventTargetListeners)]: 10,
[Symbol(events.maxEventTargetListenersWarned)]: false,
[Symbol(kHandlers)]: SafeMap(0) [Map] {},
[Symbol(kAborted)]: false,
[Symbol(kReason)]: undefined,
[Symbol(kComposite)]: false,
[Symbol(kTimeout)]: true
},
expected: undefined,
operator: 'strictEqual'
}
Node.js v21.0.0-pre
... |
There was a problem hiding this comment.
Why not?
| await setTimeout(0); | |
| await Promise.resolve(); |
There was a problem hiding this comment.
because it won't GC with this
|
Landed in c39f04c |
Fixes: nodejs#48951 PR-URL: nodejs#48952 Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Fixes: nodejs#48951 PR-URL: nodejs#48952 Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Fixes: nodejs#48951 PR-URL: nodejs#48952 Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
|
Was this included in, or is planned to be included in v18? |
This was released just in v20.6.0, which means it will take some time to reach v18 which is LTS, but hopefully it should happen soon 🙂 |
Fixes: nodejs/node#48951 PR-URL: nodejs/node#48952 Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Fixes: nodejs/node#48951 PR-URL: nodejs/node#48952 Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Fixes: #48951