fix(forge): monitor beam rewriting worker process #370
+52
−15
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.
This is part of a set of 4 PRs that arose out of some static analysis tooling I'm working on:
That means that these aren't crashes or issues that I've observed in practice, however based on my reading of the code, they do represent issues worth addressing.
Problem:
Beams.apply_to_all/2spawns its worker process using a barespawn/1, and then blocks inblock_until_done/3until it receives a:progressmessage from it. If the worker crashes, this message will never arrive, and the caller will block indefinitely.Solution
Replace
spawn/1withspawn_monitor/1, and add areceiveclause inblock_until_done/3to handle the worker unexpectedly terminating before a:progressmessage is sent, so that we're able to immediately raise instead of blocking forever.In the successful case, the monitor is flushed to avoid
:DOWNmessages building up and causing a mailbox leak.