GitHub user dimas-b opened a pull request: https://github.com/apache/tinkerpop/pull/899
TINKERPOP-2005: Intermittent NullPointerException in response handling Address [TINKERPOP-2005](https://issues.apache.org/jira/browse/TINKERPOP-2005) by ignoring more than one "final" response messages from `AbstractEvalOpProcessor`. Add `isFinalResponse()` getter to `ResponseStatusCode` Introduce `ResponseHandlerContext` to allow tracking the final response status per request message. Update `AbstractOpProcessor`, `AbstractEvalOpProcessor` and related classes to write response messages through `ResponseHandlerContext` methods as opposed to `ChannelHandlerContext` methods. ---- In addition to the failure mode described in [TINKERPOP-2005](https://issues.apache.org/jira/browse/TINKERPOP-2005) non-timeout script evaluation exceptions in AbstractEvalOpProcessor may occur after the script has started executing. In this situation it it critical to prevent potentially writing multiple final (e.g. error vs. success) responses back to the client. This failure mode is hard to replicate in a pure Gremlin server, however the new `AbstractEvalOpProcessorTest` class provides coverage for it. ---- Testing performed: * Full suite of unit tests (i.e. `mvn clean install`) * Full suite of `gremlin-server` integration tests (`mvn verify -pl gremlin-server -DskipIntegrationTests=false`) * Manual testing according to comment under [TINKERPOP-2005](https://issues.apache.org/jira/browse/TINKERPOP-2005). You can merge this pull request into a Git repository by running: $ git pull https://github.com/dimas-b/tinkerpop TINKERPOP-2005-alt Alternatively you can review and apply these changes as the patch at: https://github.com/apache/tinkerpop/pull/899.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #899 ---- commit f592e3446c84e9398e242a072cdfec64025e9566 Author: Dmitri Bourlatchkov <dmitri.bourlatchkov@...> Date: 2018-07-27T19:54:06Z TINKERPOP-2005 Reject multiple final responses in AbstractEvalOpProcessor Add isFinalResponse() getter to ResponseStatusCode Introduce ResponseHandlerContext to allow tracking the final response status per request message. Update AbstractOpProcessor, AbstractEvalOpProcessor and related classes to write response messages through ResponseHandlerContext methods as opposed to ChannelHandlerContext methods. commit b7a44953c8ac62f308b78709ab2565a78eddb1af Author: Dmitri Bourlatchkov <dmitri.bourlatchkov@...> Date: 2018-07-30T16:38:21Z TINKERPOP-2005 Handle evaluation excetions in AbstractEvalOpProcessor Some script evaluation exceptions in AbstractEvalOpProcessor may occur after the script has started executing. In this situation it it critical to prevent potentially writing multiple final (e.g. error vs. success) responses back to the client. Exceptions that used to escape from evalOpInternal(...) would be converted to error response messages by OpExecutorHandler, which could coincide with a successful response from a quick script. This change makes AbstractEvalOpProcessor do the error message writing for the same type of exceptions that are handled by OpExecutorHandler. However, AbstractEvalOpProcessor makes sure that at most one final reponse message is sent by using ResponseHandlerContext. Also ResponseHandlerContext.writeAndFlush(...) methods will no longer throw exceptions for attempts to send multiple final messages. This is again to avoid multiple error response messages sent from OpExecutorHandler. commit 4ff4b88a5b663f86917299691edc6f84a6bd1c67 Author: Dmitri Bourlatchkov <dmitri.bourlatchkov@...> Date: 2018-07-30T19:57:14Z TINKERPOP-2005 Encapsulate test eval timeout overrides in a method This is to avoid directly exposing other settings whose changes may not be effective until the server is restarted. ---- ---