fix(control_supervisor): do not pipe child stdout into an unread pipe - #52
Open
Arcod7 wants to merge 1 commit into
Open
fix(control_supervisor): do not pipe child stdout into an unread pipe#52Arcod7 wants to merge 1 commit into
Arcod7 wants to merge 1 commit into
Conversation
Children were spawned with stdout=PIPE and stderr=STDOUT, but nothing ever drained them: the Popen handles are only used for poll() and termination. Once the 64 KB kernel pipe buffer filled, the child blocked in write() and never recovered. For ros2_control_node this is quiet and misleading. Its real-time update loop is a separate thread and keeps publishing /joint_states at the configured rate, so the robot looks connected, but the main thread runs the executor -- so every subscription and service callback stops. Trajectory commands on <controller>/joint_trajectory are never consumed and every /controller_manager service times out. Send child stdout/stderr to DEVNULL instead.
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.
Children were spawned with stdout=PIPE and stderr=STDOUT, but nothing ever
drained them: the Popen handles are only used for poll() and termination.
Once the 64 KB kernel pipe buffer filled, the child blocked in write() and
never recovered.
For ros2_control_node this is quiet and misleading. Its real-time update
loop runs on a separate thread and keeps publishing /joint_states, so the
robot looks connected -- but the main thread runs the executor, so every
subscription and service callback stops. Trajectory commands are never
consumed and every /controller_manager service times out.
Send child stdout/stderr to DEVNULL instead.
Predates #51 (spawner-lock serialization, ready marker) -- that PR touched
the same file but not these three Popen calls, so this is still live on
feat-pixi.