Skip to content

urlopen() hangs and eats 100% CPU on some https urls (git bisect found problematic commit) #7891

@im-0

Description

@im-0

Summary

RustPython 0.5.0 (and also current main) hangs and starts eating 100% CPU (one core) on first or second iteration of following script:

import urllib.request
for i in range(3):
    print(i)
    req=urllib.request.Request('https://crates.io/api/v1/crates/tokio')
    with urllib.request.urlopen(req) as r:
        r.read()

Interesting thing is, reproducibility depends on what exactly HTTPs server sends to the client. Just HTTPs plus relatively large file is not enough. For example, bug completely disappears when I replace https://crates.io/api/v1/crates/tokio with https://gist.githubusercontent.com/khaykov/a6105154becce4c0530da38e723c2330/raw/41ab415ac41c93a198f7da5b47d604956157c5c3/gistfile1.txt.

I was able to git bisect this to a single problematic commit - 073adbd (#7418). Reverting it on top of 0.5.0 fixes this issue for me. And I have no idea about how to fix this properly.

Expected

RustPython should terminate after three iterations.

Actual

RustPython hangs and starts eating 100% CPU

Python Documentation

N/A

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions