Uh oh!
There was an error while loading. Please reload this page.
fix(stream): a child's pipe must not kill the run that owns it - #42
Merged
Conversation
A killed child's stdout and stderr can emit `error` after the fact, and a stream with no error listener throws to the top of the process. Measured: a 42-cell study died at cell 3 on an unhandled EPIPE, after two cells had already cost twenty minutes each. `stdin` was handled and reported the policy that stopped reading; the other two pipes had `resume()` and a data listener and no error listener at all. The child's fate already reaches an operator through `health()`, so these listeners record into the same bounded buffer that explains a dead agent and do not rethrow. Both launchers get the same treatment, because a launcher's job is to outlive its agent long enough to publish the meter.
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
A killed child's
stdoutandstderrcan emiterrorafter the fact, and a stream with no error listener throws to the top of the process.Measured: a 42-cell study died at cell 3 on an unhandled
EPIPE, after two cells had already cost twenty minutes each.stdinwas handled and reports "the policy stopped reading its input"; the other two pipes hadresume()and a data listener and no error listener at all.The child's fate already reaches an operator through
health(), so these listeners record into the same bounded buffer that explains a dead agent, and do not rethrow. Both launchers get the same treatment, because a launcher's job is to outlive its agent long enough to publish the meter.Local: 20 of 20 test files, boundary check, 0 typecheck errors.