nodejs / node

Node.js JavaScript runtime ✨🐢🚀✨
https://nodejs.org
Other
106.52k stars 29.03k forks source link

TypeError: Method Map.prototype.set called on incompatible receiver #<AsyncContextFrame> #54503

Closed bengl closed 1 week ago

bengl commented 3 weeks ago

Version

v22.7.0

Platform

Darwin poutine-mac 23.6.0 Darwin Kernel Version 23.6.0: Fri Jul  5 17:56:41 PDT 2024; root:xnu-10063.141.1~2/RELEASE_ARM64_T6000 arm64 arm Darwin

Subsystem

async_hooks

What steps will reproduce the bug?

node --experimental-async-context-frame -e "new async_hooks.AsyncLocalStorage().run({}, () => {})"

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

100% always happens.

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

The above command should just exit cleanly with no output.

What do you see instead?

node:internal/async_context_frame:56
    this.set(store, data);
         ^

TypeError: Method Map.prototype.set called on incompatible receiver #<AsyncContextFrame>
    at AsyncContextFrame.set (<anonymous>)
    at new AsyncContextFrame (node:internal/async_context_frame:56:10)
    at AsyncLocalStorage.enterWith (node:internal/async_local_storage/async_context_frame:24:19)
    at AsyncLocalStorage.run (node:internal/async_local_storage/async_context_frame:30:10)
    at [eval]:1:37
    at runScriptInThisContext (node:internal/vm:209:10)
    at node:internal/process/execution:118:14
    at [eval]-wrapper:6:24
    at runScript (node:internal/process/execution:101:62)
    at evalScript (node:internal/process/execution:136:3)

Node.js v22.7.0

Additional information

While the test suite includes the running of async-local-storage tests with the flag enabled, it doesn't actually check whether those files actually passed or failed. It just runs them. That's why this wasn't caught.

I think I have a fix ready. I'm just waiting on a compile to verify.

andreialecu commented 2 weeks ago

I was excited about trying --experimental-async-context-frame to check if it helps with open telemetry tracing overhead, and I just ran into this issue.

CleanShot 2024-08-23 at 15 39 05@2x

RedYetiDev commented 2 weeks ago
$ node --experimental-async-context-frame -e "new async_hooks.AsyncLocalStorage().run({}, () => {})" 
node:internal/async_context_frame:56
    this.set(store, data);
         ^

TypeError: Method Map.prototype.set called on incompatible receiver #<AsyncContextFrame>
    at AsyncContextFrame.set (<anonymous>)
    at new AsyncContextFrame (node:internal/async_context_frame:56:10)
    at AsyncLocalStorage.enterWith (node:internal/async_local_storage/async_context_frame:24:19)
    at AsyncLocalStorage.run (node:internal/async_local_storage/async_context_frame:30:10)
    at [eval]:1:37
    at runScriptInThisContext (node:internal/vm:209:10)
    at node:internal/process/execution:118:14
    at [eval]-wrapper:6:24
    at runScript (node:internal/process/execution:101:62)
    at evalScript (node:internal/process/execution:136:3)

Node.js v22.7.0