MagicStack / MagicStack/asyncpg

ConnectionDoesNotExistError when releasing

Ouverte
#624 0 commentaires 4 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Python
Étoiles
8.1k
Forks
468
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

  • asyncpg version: 0.21.0
  • PostgreSQL version: 10.7
  • Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
    the issue with a local PostgreSQL install?
    : no
  • Python version: 3.7
  • Platform: debian (docker image python:3.7.9-slim)
  • Do you use pgbouncer?: no
  • Did you install asyncpg with pip?: yes
  • If you built asyncpg locally, which version of Cython did you use?: no
  • Can the issue be reproduced under both asyncio and
    uvloop?
    : only tried asyncio

I've found the following exception in our logs:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/asyncpg/pool.py", line 214, in release
    self._con.terminate()
AttributeError: 'NoneType' object has no attribute 'terminate'

During handling of the above exception, another exception occurred:
File "/usr/local/lib/python3.7/site-packages/my_code_calling_release.py", line 40, in acquire
     await self.pool.release(con)
File "/usr/local/lib/python3.7/site-packages/asyncpg/pool.py", line 654, in release
     return await asyncio.shield(ch.release(timeout))   
File "/usr/local/lib/python3.7/site-packages/asyncpg/pool.py", line 216, in release
     raise ex   
File "/usr/local/lib/python3.7/site-packages/asyncpg/pool.py", line 206, in release
     await self._con.reset(timeout=budget)
File "/usr/local/lib/python3.7/site-packages/asyncpg/connection.py", line 1137, in reset
     await self.execute(reset_query, timeout=timeout)
File "/usr/local/lib/python3.7/site-packages/asyncpg/connection.py", line 295, in execute
     return await self._protocol.query(query, timeout)
File "asyncpg/protocol/protocol.pyx", line 316, in query

From what I can see, the call at self._con.reset is raising a ConnectionDoesNotExistError.
Should the exception be reraised at line 218 if the exception is an ConnectionDoesNotExistError (we know it's already closed)? It shouldn't even try to self._con.terminate() because self._con is already None (see the exception).

Not sure if the comments in that code still apply for that type of exception

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Lisez le chemin de release autour des lignes 206-218 de asyncpg/pool.py ainsi que le chemin de reset dans asyncpg/connection.py, en vous concentrant sur la manière dont ConnectionDoesNotExistError laisse self._con à None. Reproduisez ou ajoutez un cas de régression pour la libération d’une connexion déjà fermée, puis vérifiez que release n’essaie pas de terminer une connexion manquante et préserve le comportement d’exception attendu.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
postgresql, python
Domaine
databases
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.