graphql-python / graphql-python/graphql-core-legacy
Query execution hangs forever when BaseException is thrown
- Vorherrschende Sprache
- Python
- Sterne
- 372
- Forks
- 175
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
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?
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Rechercherichtung
Reproduziere die bereitgestellte Graphene-Mutation mit SystemExit und verfolge das Warten in promise.Promise.get(). Lies graphql/execution/executors/utils.py in Zeile 20 und graphql/execution/executor.py ungefähr in Zeile 448, und überprüfe anschließend, dass eine BaseException während der Ausführung die Abfrage nicht länger hängen lässt und dass das resultierende Verhalten durch einen geeigneten Regressionstest abgedeckt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- backend-api-design
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 50/100