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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 3 additions and 1 deletions

View File

@ -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.

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