Skip to content

asyncio hang in subprocess wait_closed() on Windows, BrokenPipeError #89237

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
byllyfish mannequin opened this issue Sep 1, 2021 · 2 comments
Closed

asyncio hang in subprocess wait_closed() on Windows, BrokenPipeError #89237

byllyfish mannequin opened this issue Sep 1, 2021 · 2 comments
Assignees
Labels
3.10 only security fixes 3.11 only security fixes 3.12 only security fixes topic-asyncio type-bug An unexpected behavior, bug, or error

Comments

@byllyfish
Copy link
Mannequin

byllyfish mannequin commented Sep 1, 2021

BPO 45074
Nosy @asvetlov, @1st1
Files
  • wait_closed.py: demonstrate hang in stream.wait_closed()
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = None
    created_at = <Date 2021-09-01.05:10:33.552>
    labels = ['type-bug', '3.9', '3.10', 'expert-asyncio']
    title = 'asyncio hang in subprocess wait_closed() on Windows, BrokenPipeError'
    updated_at = <Date 2021-09-01.05:10:33.552>
    user = 'https://bugs.python.org/byllyfish'

    bugs.python.org fields:

    activity = <Date 2021-09-01.05:10:33.552>
    actor = 'byllyfish'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['asyncio']
    creation = <Date 2021-09-01.05:10:33.552>
    creator = 'byllyfish'
    dependencies = []
    files = ['50250']
    hgrepos = []
    issue_num = 45074
    keywords = []
    message_count = 1.0
    messages = ['400810']
    nosy_count = 3.0
    nosy_names = ['asvetlov', 'yselivanov', 'byllyfish']
    pr_nums = []
    priority = 'normal'
    resolution = None
    stage = None
    status = 'open'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue45074'
    versions = ['Python 3.9', 'Python 3.10']

    @byllyfish
    Copy link
    Mannequin Author

    byllyfish mannequin commented Sep 1, 2021

    I have a reproducible case where stdin.wait_closed() is hanging on
    Windows. This happens in response to a BrokenPipeError. The same code
    works fine on Linux and MacOS.

    Please see the attached code for the demo.

    I believe the hang is related to this debug message from the logs:

    DEBUG <_ProactorWritePipeTransport closing fd=632>: Fatal write error on pipe transport
    Traceback (most recent call last):
      File "C:\hostedtoolcache\windows\Python\3.9.6\x64\lib\asyncio\proactor_events.py", line 379, in _loop_writing
        f.result()
      File "C:\hostedtoolcache\windows\Python\3.9.6\x64\lib\asyncio\windows_events.py", line 812, in _poll
        value = callback(transferred, key, ov)
      File "C:\hostedtoolcache\windows\Python\3.9.6\x64\lib\asyncio\windows_events.py", line 538, in finish_send
        return ov.getresult()
    BrokenPipeError: [WinError 109] The pipe has been ended

    It appears that the function that logs "Fatal write error on pipe transport" also
    calls _abort on the stream. If _abort is called before stdin.close(), everything is okay.
    If _abort is called after stdin.close(), stdin.wait_closed() will hang.

    Please see issue bpo-44428 for another instance of a similar hang in wait_closed().

    @byllyfish byllyfish mannequin added 3.9 only security fixes 3.10 only security fixes topic-asyncio type-bug An unexpected behavior, bug, or error labels Sep 1, 2021
    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    @ezio-melotti ezio-melotti moved this to Todo in asyncio Jul 17, 2022
    @kumaraditya303
    Copy link
    Contributor

    This bug is another instance of protocol.connection_lost callback not getting called correctly. With #98572 the callback is always called which fixes the issue.

    With fix output:

    Running Debug|x64 interpreter...
    BrokenPipe 1 - correct
    BrokenPipe 2 - correct
    

    @kumaraditya303 kumaraditya303 self-assigned this Oct 23, 2022
    @kumaraditya303 kumaraditya303 added 3.11 only security fixes 3.12 only security fixes and removed 3.9 only security fixes labels Oct 23, 2022
    miss-islington pushed a commit to miss-islington/cpython that referenced this issue Oct 24, 2022
    miss-islington pushed a commit to miss-islington/cpython that referenced this issue Oct 24, 2022
    miss-islington added a commit that referenced this issue Oct 24, 2022
    (cherry picked from commit ad1dc3e)
    
    Co-authored-by: Kumar Aditya <[email protected]>
    gvanrossum pushed a commit that referenced this issue Oct 25, 2022
    …98572) (#98620)
    
    GH-89237: fix hang in proactor `subprocess.wait_closed()` (GH-98572)
    (cherry picked from commit ad1dc3e)
    
    Co-authored-by: Kumar Aditya <[email protected]>
    Repository owner moved this from Todo to Done in asyncio Oct 25, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.10 only security fixes 3.11 only security fixes 3.12 only security fixes topic-asyncio type-bug An unexpected behavior, bug, or error
    Projects
    Status: Done
    Development

    No branches or pull requests

    2 participants