graphql-python / graphql-python/graphql-core-legacy
Query execution hangs forever when BaseException is thrown
- 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