Skip to content

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

Description

@byllyfish
mannequin
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']

    Activity

    1. byllyfish commented on Sep 1, 2021

      byllyfishmannequin
      MannequinAuthor

      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().

    2. transferred this issue fromon Apr 10, 2022
    3. kumaraditya303 commented on Oct 23, 2022

      @kumaraditya303
      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
      
    4. added
      3.11only security fixes
      3.12only security fixes
      and removed on Oct 23, 2022
    5. added a commit that references this issue on Oct 24, 2022
    6. added 3 commits that reference this issue on Oct 24, 2022
    7. added a commit that references this issue on Oct 25, 2022
    8. Repository owner moved this from Todo to Done in asyncioon Oct 25, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Labels

    3.10 (EOL)end of life3.11only security fixes3.12only security fixestopic-asynciotype-bugAn unexpected behavior, bug, or error

    Projects

    • Status
      Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions