elixir: convert DirtyIo nifs to use message passing for asynchronous responses#172
Draft
npry wants to merge 5 commits into
Draft
elixir: convert DirtyIo nifs to use message passing for asynchronous responses#172npry wants to merge 5 commits into
DirtyIo nifs to use message passing for asynchronous responses#172npry wants to merge 5 commits into
Conversation
840d0ab to
515f752
Compare
Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: Ibdfa3c10dd50379a43b52a07c1a713cd6a6a6964
It erroneously expected all deps to have `workspace = true`, now checks this correctly. Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: Iafe01153ca52b9f618c80666de5e6f186a6a6964
Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: Iafe01153ca52b9f618c80666de5e6f186a6a6964
Potentially-blocking Rust-side calls now use message passing to respond to the caller. Elixir now has `Tailscale.Util.await`, which spawns a task that listens for the relevant response. Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: Iafe01153ca52b9f618c80666de5e6f186a6a6964
Provide tests to exercise the async callback type conversions. Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: Iafe01153ca52b9f618c80666de5e6f186a6a6964 Change-Id: I9d1d3e23de8a558fc6f0f81677b6237e6a6a6964 Signed-off-by: Nathan Perry <nathan@tailscale.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
DirtyIONIFs are thread-pooled by the BEAM behind the scenes, and though the pool is configurable, this approach can limit throughput in highly concurrent scenarios. This is an alternate approach that offloads the synchronization to message passing using elixir'sTaskabstraction (slightly cleaner interface around processes) and a helper macro that handles spawning the task, waiting for it, and destructuring the response message. This is done in a task rather than the caller's process to avoid clashing with any existing message handling it might be doing (though a macro is also provided to support the in-process receive, which I think we may want for #119).I don't believe there will be a great amount of overhead for this approach, since spawning tasks on both the
tokioand BEAM sides should be quite cheap.Also refactors the
ts_elixirRust code a fair amount — I understand a bit better now how rustler wants to be held to avoid a bunch of explicit conversions.review notes
Probably much easier to read commit-by-commit