The current implementation of ExecutionContext use a very mutable pattern and hence is not thread safe in Java. There is not "happens before" relationship in place with the various members.
public class ExecutionContext {
private GraphQLSchema graphQLSchema;
private ExecutionStrategy executionStrategy;
private Map<String, FragmentDefinition> fragmentsByName = new LinkedHashMap<String, FragmentDefinition>();
private OperationDefinition operationDefinition;
private Map<String, Object> variables = new LinkedHashMap<String, Object>();
private Object root;
private List<GraphQLError> errors = new ArrayList<GraphQLError>();
It is especially evident in the errors list which is meant to be a running list of problems along the way. Testing with a ExecutorService reveals that errors MAY NOT be thread visible since its not using synchrnonised or better concurrent constructs. A CopyOnWriteAArrayList would help
Or the ExecutionContext could be made immutable. It would copy itself every time it needed to mutate (eg adding errors)
ExecutionContext newCtx = currentCtx.addError(someError);
Looking at the code it seems that ExecutionContextBuilder is the only setter of the attributes other than errors and hence I think the set calls could be removed and a CopyOnWriteAArrayList used to capture errors
The current implementation of ExecutionContext use a very mutable pattern and hence is not thread safe in Java. There is not "happens before" relationship in place with the various members.
It is especially evident in the errors list which is meant to be a running list of problems along the way. Testing with a ExecutorService reveals that errors MAY NOT be thread visible since its not using synchrnonised or better concurrent constructs. A CopyOnWriteAArrayList would help
Or the ExecutionContext could be made immutable. It would copy itself every time it needed to mutate (eg adding errors)
Looking at the code it seems that ExecutionContextBuilder is the only setter of the attributes other than errors and hence I think the set calls could be removed and a CopyOnWriteAArrayList used to capture errors