nan icon indicating copy to clipboard operation
nan copied to clipboard

async_hooks in node 8

Open kkoopa opened this issue 7 years ago • 5 comments

There were major changes to async_hooks between 8.5.0 and 8.6.0. The same setup that works on 8.6.0 and above results in the following assertion on 8.5.0: ../src/node.cc:1379:v8::MaybeLocal<v8::Value> node::MakeCallback(node::Environment*, v8::Local<v8::Value>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*, node::async_context): Assertion '(env->current_async_id()) == (asyncContext.async_id)' failed.

Until this is resolved, async_hooks will remain disabled for all of Node 8. See #738.

kkoopa avatar Feb 22 '18 23:02 kkoopa

cc @ofrobots

bnoordhuis avatar Feb 23 '18 09:02 bnoordhuis

After closer inspection, it seems the problem stems from env->current_async_id() always returning 0.

kkoopa avatar Feb 25 '18 23:02 kkoopa

Thanks for the ping @bnoordhuis. I have sporadic time availability due to travel presently – I will take a look when possible.

ofrobots avatar Feb 26 '18 01:02 ofrobots

Not sure if this is the root cause of the above assert but in https://github.com/nodejs/node/pull/14040 there was a significant change in async hooks API but it was not applied on 8.6.0 (already before) e.g. node::EmitAsyncInit() requires 4 parameters in Node 8.0.0 but only 3 mandatory in latest 8.x. Also return type differs.

Above PR introduced also a backward compatible APIs. Maybe using this for 8.x allows to introduce async_hooks in NAN already for 8.x and still allow reuse of binaries for all 8.x versions.

Flarna avatar Feb 26 '18 07:02 Flarna

Not sure if this is the root cause of the above assert but in nodejs/node#14040 there was a significant change in async hooks API but it was not applied on 8.6.0 (already before) e.g. node::EmitAsyncInit() requires 4 parameters in Node 8.0.0 but only 3 mandatory in latest 8.x. Also return type differs.

Yes, that partly applies to Node 8.0.0, but is rather easily worked around. I have code which compiles with 8.0.0, but still does not have an execution scope set up and leads to the assert triggering.

It seems (almost) all minor versions between 8.0 and 8.5 will need testing and some shimming and conditional compilation to smooth out differences. The javascript API is also affected by changes and renaming, but is out of scope for NAN, apart from getting the tests running correctly.

Above PR introduced also a backward compatible APIs. Maybe using this for 8.x allows to introduce async_hooks in NAN already for 8.x and still allow reuse of binaries for all 8.x versions.

This seems interesting. I had not thought about using the legacy API in this way, but it might actually work. It might lead to some deprecation warnings, but then again those old versions of Node 8 should not be used anyway, so it could be worth paying that price.

kkoopa avatar Feb 26 '18 10:02 kkoopa