Prevent IO capture hang/loss in basic.run_command (#85869)

* Prevent run_command output truncation or hang

In cases when the selector used to monitor stdout/stderr activates without
data ready to read (a rare but normal condition), a read from a non-blocking
FD can return `None`, which was being conflated with an empty read (EOF)
condition. This caused the selector to be unregistered prematurely,
sometimes resulting in truncated output or hangs. `None` read results
are now excluded from EOF conditions.

* add changelog

---------

Co-authored-by: Matt Davis <nitzmahone@redhat.com>
This commit is contained in:
Chris Meyers
2025-09-19 12:56:21 -04:00
committed by GitHub
parent 27a56a34df
commit 79ddee15a0
2 changed files with 3 additions and 1 deletions
@@ -0,0 +1,2 @@
bugfixes:
- run_command - Fixed premature selector unregistration on empty read from stdout/stderr that caused truncated output or hangs in rare situations.
+1 -1
View File
@@ -2093,7 +2093,7 @@ class AnsibleModule(object):
stdout_changed = False
for key, event in events:
b_chunk = key.fileobj.read(32768)
if not b_chunk:
if not b_chunk and b_chunk is not None:
selector.unregister(key.fileobj)
elif key.fileobj == cmd.stdout:
stdout += b_chunk