graaljs icon indicating copy to clipboard operation
graaljs copied to clipboard

Problems about the async_hooks module

Open Soulike opened this issue 4 years ago • 2 comments

Hi. I'm using GraalVM 21.1.0 with Node.js installed (by gu install nodejs) on macOS 11.4. I want to acquire triggerAsyncId and executionAsyncId using the async_hooks module for indicating the relationship between async contexts, but the execution results of Node.js and $GRAALVM/bin/node are different.

Code

const fs = require('fs');
const async_hooks = require('async_hooks');

async_hooks.createHook({
    init(asyncId, type, triggerAsyncId, resource)
    {
        fs.writeSync(1, `init: ${triggerAsyncId} -> ${asyncId}\n`);
    },
    before(asyncId)
    {
        fs.writeSync(1, `before: ${async_hooks.triggerAsyncId()} -> ${async_hooks.executionAsyncId()}\n`);
    },
}).enable();

let globalVar = 1;

async function setTimeoutAsync(timeout)
{
    return new Promise(resolve =>
    {
        setTimeout(() => resolve(), timeout);
    });
}

async function asyncFunc()
{
    globalVar = 2;
    await setTimeoutAsync(10);
    fs.writeSync(1, `${async_hooks.triggerAsyncId()} -> ${async_hooks.executionAsyncId()}\n`);
    globalVar = 3;
    await setTimeoutAsync(10);
    fs.writeSync(1, `${async_hooks.triggerAsyncId()} -> ${async_hooks.executionAsyncId()}\n`);
    globalVar = 4;
}

asyncFunc();

Output of Node.js 14.16.1

init: 1 -> 2
init: 1 -> 3
init: 1 -> 4
init: 1 -> 5
init: 3 -> 6
before: 1 -> 3
init: 4 -> 7
before: 1 -> 5
before: 4 -> 7
before: 3 -> 6
3 -> 6
init: 6 -> 8
init: 6 -> 9
init: 6 -> 10
init: 8 -> 11
before: 6 -> 8
init: 9 -> 12
before: 6 -> 10
before: 9 -> 12
before: 8 -> 11
8 -> 11

Output of $GRAALVM/bin/node (also 14.16.1)

init: 1 -> 2
init: 1 -> 3
init: 1 -> 4
init: 1 -> 5
init: 4 -> 6
before: 1 -> 5
before: 4 -> 6
0 -> 0
init: 0 -> 7
init: 0 -> 8
init: 0 -> 9
init: 8 -> 10
before: 0 -> 9
before: 8 -> 10
0 -> 0

The problem is that if async_hooks.triggerAsyncId() or async_hooks.executionAsyncId() returns 0, it's impossible for me to get the relationship between async contexts.

Soulike avatar Jun 20 '21 13:06 Soulike

And it seems that the difference only appears with async/await code?

Soulike avatar Jun 20 '21 13:06 Soulike

@Soulike Thanks for reporting the issue we will look into it and get back to you

munishchouhan avatar Jun 22 '21 05:06 munishchouhan