graphql-python / graphql-python/graphql-core-legacy

Query execution hangs forever when BaseException is thrown

Aperta
#225 2 commenti 2 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Python
Stelle
372
Fork
175
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

If BaseExcetion will occur during query execution everything hangs. I've tried different executors, but this doesn't help. I used `SystemExit` in example for brevity. My real situation was pytest-django throwing exception when you try to access database.

## Example code

```python
import graphene
from graphene.test import Client

class CreatePerson(graphene.Mutation):
ok = graphene.Boolean()

def mutate(self, info):
# Throwing sth that derives from BaseExcetion instead of Exception here causes freeze
raise SystemExit

class Mutation(graphene.ObjectType):
create_person = CreatePerson.Field()

schema = graphene.Schema(mutation=Mutation)
Client(schema).execute('''
mutation{
createPerson{
ok
}
}
''')
```
My debugger shows that it's freezed on this line. Inside `get` promise calls `wait()` and waits forever.
https://github.com/graphql-python/graphql-core/blob/master/graphql/execution/executor.py#L147

Full traceback

```
File "/home/bond/.PyCharm2018.3/config/scratches/scratch_4.py", line 26, in
''')
File "python3.7/site-packages/graphene/test/__init__.py", line 40, in execute
executed = self.schema.execute(*args, **dict(self.execute_options, **kwargs))
File "python3.7/site-packages/graphene/types/schema.py", line 102, in execute
return graphql(self, *args, **kwargs)
File "python3.7/site-packages/graphql/graphql.py", line 44, in graphql
return execute_graphql(*args, **kwargs)
File "python3.7/site-packages/graphql/graphql.py", line 70, in execute_graphql
**execute_options
File "python3.7/site-packages/graphql/backend/core.py", line 34, in execute_and_validate
return execute(schema, document_ast, *args, **kwargs)
File "python3.7/site-packages/graphql/execution/executor.py", line 147, in execute
return promise.get()
File "python3.7/site-packages/promise/promise.py", line 509, in get
self._wait(timeout or DEFAULT_TIMEOUT)
File "python3.7/site-packages/promise/promise.py", line 504, in _wait
self.wait(self, timeout)
```

## Solution

Looks like it should be caught here:
https://github.com/graphql-python/graphql-core/blob/master/graphql/execution/executors/utils.py#L20
https://github.com/graphql-python/graphql-core/blob/master/graphql/execution/executor.py#L448
Am I right?

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Reproduce the provided Graphene mutation with SystemExit and trace the wait in promise.Promise.get(). Read graphql/execution/executors/utils.py at line 20 and graphql/execution/executor.py around line 448, then verify that BaseException during execution no longer leaves the query hanging and that the resulting behavior is covered by an appropriate regression test.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
backend-api-design
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
50/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.