fix(backend-native): Handle closed channel on Rust side #9242
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Check List
Description of Changes Made (if issue reference is not provided)
DataFusion can execute complex queries, containing multiple CubeScans, specifically multiple
CubeScanExecutionPlan
in physical planCubeScanExecutionPlan
s can be executed concurrently, and as such concurrently trigger load calls onTransportService
Then, if one of several concurrent calls receives error whole stream with still-executing-plans can be dropped
For
NodeBridgeTransport
this would lead to dropping receiver side incall_raw_js_with_channel_as_callback
But sender side would continue to live in JS thread
Then JS side can call
writerOrChannel.resolve
, and it would find that channel is closed, and raise exceptionBut then this exception will be caught, leading to
writerOrChannel.reject
callAnd because
writerOrChannel.resolve
already consumed channel it would raise its own exceptionAnd, because
wrapNativeFunctionWithStream
uses async function, this exception would lead to promise rejection, will not get caught in native part on JS side (it does not care for return values), and can trigger unhandled rejection