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

Query execution hangs forever when BaseException is thrown

Offen
#225 2 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.