MagicStack / MagicStack/asyncpg
Query Wait Timout Error from Pgbouncer Not Propogating to Client
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 8.1k
- Fork
- 468
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
When pgbouncer kills a connection due to its query_wait_timeout, the error message is not propagated to the client. All that is provided to the client is a not very helpful message "connection was closed in the middle of operation". This error message seems to be correctly handled by psql and psycopg.
I replicated this by using a pgbouncer instance with a pool_size of 1 and made sure another connection was consuming this connection to ensure that the connection would be put in a waiting mode.
asyncpg version
```
> python -c 'import asyncpg; print(asyncpg.__version__)'
0.31.0
```
Example asyncpg code
```python
import asyncio
import asyncpg
async def main():
conn = await asyncpg.connect('postgresql://postgres@localhost:6432/postgres')
row = await conn.execute('SELECT 1')
asyncio.run(main())
```
Stdout from the above code
```
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3.12/asyncio/runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "", line 3, in main
File "/path/to/venv/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute
result = await self._protocol.query(query, timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "asyncpg/protocol/protocol.pyx", line 375, in query
asyncpg.exceptions.ConnectionDoesNotExistError: connection was closed in the middle of operation
```
Example code for psycopg
```
import psycopg
with psycopg.connect("postgresql://postgres:@localhost:6432/postgres") as conn:
with conn.cursor() as cur:
cur.execute("SELECT 1")
```
example traceback from psycopg
```
Traceback (most recent call last):
File "", line 3, in
File "/path/to/venv/lib/python3.12/site-packages/psycopg/cursor.py", line 97, in execute
raise ex.with_traceback(None)
psycopg.errors.ProtocolViolation: query_wait_timeout
```
Example call and stdout from psql on query_wait_timeout
```bash
> psql \
'postgresql://postgres:@localhost:6432/postgres' \
--command='SELECT 1'
FATAL: query_wait_timeout
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
connection to server was lost
```
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Riproducete il timeout tramite la configurazione di pgbouncer descritta nell'issue, quindi iniziate dal percorso Connection.execute in asyncpg/connection.py e da query in asyncpg/protocol/protocol.pyx. Confrontate la gestione degli errori con gli esempi di psycopg e psql e verificate che il client esponga l'errore query_wait_timeout invece di segnalare soltanto una connessione chiusa.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- postgresql, python
- Ambito
- databases
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 38/100