Skip to content
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

Eager task factory segfaults when hosting and calling an API from the same event loop #122332

Closed
irgolic opened this issue Jul 26, 2024 · 4 comments
Labels
3.12 bugs and security fixes 3.13 bugs and security fixes 3.14 new features, bugs and security fixes topic-asyncio type-crash A hard crash of the interpreter, possibly with a core dump

Comments

@irgolic
Copy link

irgolic commented Jul 26, 2024

Crash report

What happened?

Love eager task factory, but it's crashing one of my tests. I'm using uvicorn and fastapi to host an API, and testing it with httpx running in the same event loop. This reliably produces a segfault.

It seems to only happen with streaming responses.

Here's a minimal code example:

import asyncio

import httpx
import uvicorn
from fastapi import FastAPI
from starlette.responses import StreamingResponse


async def main():
    loop = asyncio.get_running_loop()
    loop.set_task_factory(asyncio.eager_task_factory)

    app = FastAPI()

    @app.get("/")
    async def get():
        async def _():
            yield "1"

        return StreamingResponse(
            _(),
        )

    server = uvicorn.Server(
        uvicorn.Config(
            app,
            host="0.0.0.0",
            port=8080,
        )
    )
    asyncio.create_task(server.serve())

    client = httpx.AsyncClient()
    await client.get("http://localhost:8080")


if __name__ == "__main__":
    asyncio.run(main())

CPython versions tested on:

3.12

Operating systems tested on:

macOS

Output from running 'python -VV' on the command line:

Python 3.12.3 | packaged by conda-forge | (main, Apr 15 2024, 18:35:20) [Clang 16.0.6 ]

Linked PRs

@irgolic irgolic added the type-crash A hard crash of the interpreter, possibly with a core dump label Jul 26, 2024
@ZeroIntensity
Copy link
Member

ZeroIntensity commented Jul 27, 2024

I was able to reproduce this. The segfault comes from _asyncio_Task_get_coro_impl: see here, self->task_coro is NULL.

@ZeroIntensity
Copy link
Member

Ah, I think this is just a missing NULL check. Based on the docs, this should be able to return None. This needs to be reflected in typeshed as well. I'll submit a PR for this.

@ZeroIntensity
Copy link
Member

FWIW, here's a reproducer that does not need third party packages:

import asyncio


async def main():
    loop = asyncio.get_running_loop()
    loop.set_task_factory(asyncio.eager_task_factory)

    async def foo(): ...

    task = asyncio.create_task(foo())
    await task
    print(task.get_coro())


asyncio.run(main())

@Eclips4 Eclips4 added 3.12 bugs and security fixes 3.13 bugs and security fixes 3.14 new features, bugs and security fixes labels Jul 27, 2024
miss-islington pushed a commit to miss-islington/cpython that referenced this issue Jul 27, 2024
…ythonGH-122338)

(cherry picked from commit c086962)

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
miss-islington pushed a commit to miss-islington/cpython that referenced this issue Jul 27, 2024
…ythonGH-122338)

(cherry picked from commit c086962)

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
@github-project-automation github-project-automation bot moved this from Todo to Done in asyncio Jul 27, 2024
kumaraditya303 pushed a commit that referenced this issue Jul 27, 2024
…GH-122338) (#122345)

gh-122332: Fix missing `NULL` check in `asyncio.Task.get_coro` (GH-122338)
(cherry picked from commit c086962)

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
kumaraditya303 pushed a commit that referenced this issue Jul 27, 2024
…GH-122338) (#122344)

gh-122332: Fix missing `NULL` check in `asyncio.Task.get_coro` (GH-122338)
(cherry picked from commit c086962)

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
@irgolic
Copy link
Author

irgolic commented Jul 27, 2024

Nice, thanks for the fix

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.12 bugs and security fixes 3.13 bugs and security fixes 3.14 new features, bugs and security fixes topic-asyncio type-crash A hard crash of the interpreter, possibly with a core dump
Projects
Status: Done
Development

No branches or pull requests

5 participants