Given an API setup with GraphQL and Echo, a colleague ran into a race condition situation. There was a concurrent read/write issue on Echo’s context. GraphQL runs its resolvers in parallel if set so, and when context is shared between resolvers, things can go wrong.
I took a look into Echo’s context implementation and I saw a simple map is used for Get/Set.
For every API call, a handle functions is given an Echo context and executes the GraphQL schema with the specified context.
func handle(c echo.Context) error { schema, err := gqlgo.ParseSchema( ... gqlgo.MaxParallelism(10), ) schema.Exec( c, ... ) }
My solution was to use a custom context which embeds the original one and uses a concurrent map instead of Echo’s. Continue reading Race condition on Echo context with GraphQL in Go