-
Notifications
You must be signed in to change notification settings - Fork 261
Database connection hanging after a test with transactionΒ #531
Description
Hi, I am developing an API using FastAPI and Databases. I recently updated most of the projects libraries, and I'm encountering some issue with my tests. I used to use pytest-asyncio, but since the fastapi update I am now using anyio.
I was not too sure if this was the correct repository to post my issue.
When I have a transaction the database connection seems to hang at the end. I have provided simples snippets of code to reproduce the issue. As well as the hanging piece of code located in the asyncpg library. There are no error message, and I have to quit the process manually to stop it.
Here are the libraries' versions:
databases 0.7.0
βββ asyncpg *
βββ sqlalchemy >=1.4.42,<1.5
fastapi. 0.89.1
βββ starlette 0.22.0
βββ anyio >=3.4.0,<5
httpx 0.23.3
pytest 7.2.1
Fastapi main
app = FastAPI()
database = Database(..., init=...)
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
# this is where it fails
await database.disconnect()
conftest.py
@pytest.fixture(scope='session')
def anyio_backend():
return 'asyncio'
@pytest.fixture(scope="session")
async def client(anyio_backend):
# httpx.AsyncClient
async with AsyncClient(app=my_app, base_url="") as ac:
# call startup event
await my_app.router.startup()
yield ac
# call shutdown event
await my_app.router.shutdown()
test.py
@pytest.mark.anyio
async def test_test(client):
response = await client.get('/test')
router.py
@router.get("/test")
async def get_test():
transaction = await main.database.transaction()
try:
await transaction.start()
except UniqueViolationError:
await transaction.rollback()
raise HTTPException(status_code=400, detail="error")
else:
await transaction.commit()
return 200
The hanging happens in asyncpg.pool.py
in close()
release_coros = [
ch.wait_until_released() for ch in self._holders]
await asyncio.gather(*release_coros)
I hope this is enough information.
Thank you for your times