You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2019/07/26 11:27:47 UTC

[tinkerpop] branch master updated (aee038f -> ad8d663)

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git.


    from aee038f  Merge branch 'tp34'
     new 22bda83  Added a "differences" section to GLVs to call out differences from Gremlin java CTR
     add 746fb68  Use ResponseHandlerContext to ensure single final response to client
     add 5e19a88  Merge branch 'pr-1148' into TINKERPOP-2246
     add b035a72  TINKERPOP-2246 Added missing files
     add 8538af6  TINKERPOP-2246 Added back removed method in favor of deprecation
     add 2d10f92  TINKERPOP-2246 Minor code formatting fix
     new af87c3d  Merge branch 'TINKERPOP-2246-rev' into tp33
     new 8fca63b  Merge branch 'tp33' into tp34
     new ad8d663  Merge branch 'tp34'

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGELOG.asciidoc                                 |  2 +
 docs/src/reference/gremlin-variants.asciidoc       | 26 ++++++-
 .../apache/tinkerpop/gremlin/server/Context.java   | 47 ++++++++++-
 .../tinkerpop/gremlin/server/OpProcessor.java      |  4 +-
 .../gremlin/server/ResponseHandlerContext.java     |  4 +-
 .../gremlin/server/handler/OpExecutorHandler.java  |  5 +-
 .../gremlin/server/handler/OpSelectorHandler.java  |  2 +-
 .../server/handler/SaslAuthenticationHandler.java  |  1 +
 .../gremlin/server/op/AbstractEvalOpProcessor.java | 90 ++++++++++------------
 .../gremlin/server/op/AbstractOpProcessor.java     | 85 +++++++++++++-------
 .../server/op/session/SessionOpProcessor.java      |  9 ++-
 .../server/op/standard/StandardOpProcessor.java    |  2 +-
 .../server/op/traversal/TraversalOpProcessor.java  | 75 +++++++++---------
 ...nseHandlerContextTest.java => ContextTest.java} | 33 ++++----
 .../gremlin/server/ResponseHandlerContextTest.java | 73 +++++++++---------
 .../server/op/AbstractEvalOpProcessorTest.java     | 15 ++--
 .../gremlin/server/op/AbstractOpProcessorTest.java |  7 +-
 17 files changed, 286 insertions(+), 194 deletions(-)
 copy gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/{ResponseHandlerContextTest.java => ContextTest.java} (80%)


[tinkerpop] 02/04: Merge branch 'TINKERPOP-2246-rev' into tp33

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit af87c3d61f64317c371496be89cb81f34d70efc2
Merge: 4af8725 2d10f92
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Fri Jul 26 05:53:38 2019 -0400

    Merge branch 'TINKERPOP-2246-rev' into tp33

 CHANGELOG.asciidoc                                 |  2 +
 .../apache/tinkerpop/gremlin/server/Context.java   | 47 ++++++++++-
 .../tinkerpop/gremlin/server/OpProcessor.java      |  4 +-
 .../gremlin/server/ResponseHandlerContext.java     |  4 +-
 .../gremlin/server/handler/OpExecutorHandler.java  |  5 +-
 .../gremlin/server/handler/OpSelectorHandler.java  |  2 +-
 .../server/handler/SaslAuthenticationHandler.java  |  1 +
 .../gremlin/server/op/AbstractEvalOpProcessor.java | 90 ++++++++++------------
 .../gremlin/server/op/AbstractOpProcessor.java     | 77 ++++++++++--------
 .../server/op/session/SessionOpProcessor.java      |  9 ++-
 .../server/op/standard/StandardOpProcessor.java    |  3 +-
 .../server/op/traversal/TraversalOpProcessor.java  | 81 ++++++++++---------
 ...nseHandlerContextTest.java => ContextTest.java} | 33 ++++----
 .../gremlin/server/ResponseHandlerContextTest.java | 73 +++++++++---------
 .../server/op/AbstractEvalOpProcessorTest.java     | 15 ++--
 .../gremlin/server/op/AbstractOpProcessorTest.java | 26 +------
 16 files changed, 251 insertions(+), 221 deletions(-)


[tinkerpop] 01/04: Added a "differences" section to GLVs to call out differences from Gremlin java CTR

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 22bda83512645a7e0ea5ba5e91bea7ff0bc316e0
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Thu Jul 25 11:35:15 2019 -0400

    Added a "differences" section to GLVs to call out differences from Gremlin java CTR
---
 docs/src/reference/gremlin-variants.asciidoc | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/docs/src/reference/gremlin-variants.asciidoc b/docs/src/reference/gremlin-variants.asciidoc
index 67e89e3..e3581fc 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -598,9 +598,12 @@ Gremlin-Java constructs. Moreover, given its scripting nature, Gremlin-Groovy se
 ----
 compile group: 'org.apache.tinkerpop', name: 'gremlin-core', version: '3.3.4'
 compile group: 'org.apache.tinkerpop', name: 'gremlin-driver', version: '3.3.4'
-----
+---- 
+
+[[gremlin-groovy-differences]
+=== Differences
 
-WARNING: In Groovy, `as`, `in`, and `not` are reserved words. Gremlin-Groovy does not allow these steps to be called
+In Groovy, `as`, `in`, and `not` are reserved words. Gremlin-Groovy does not allow these steps to be called
 statically from the anonymous traversal `+__+` and therefore, must always be prefixed with `+__.+` For instance:
 `+g.V().as('a').in().as('b').where(__.not(__.as('a').out().as('b')))+`
 
@@ -951,6 +954,17 @@ g.V().both()[1].toList()
 g.V().both().name.toList()
 ----
 
+[[gremlin-python-differences]
+=== Differences
+
+In situations where Python reserved words and global functions overlap with standard Gremlin steps and tokens, those
+bits of conflicting Gremlin get an underscore appended as a suffix:
+
+*Steps* - <<and-step,and_()>>, <<as-step,as_()>>, <<from-step,from_()>>, <<is-step,is_()>>, <<in-step,in_()>>,
+<<not-step,not_()>>, <<or-step,or_()>>, <<with-step,with_()>>
+
+*Tokens* - <<a-note-on-scopes,Scope.global_>>
+
 === Limitations
 
 * Traversals that return a `Set` *might* be coerced to a `List` in Python. In the case of Python, number equality
@@ -1304,3 +1318,11 @@ const g = traversal(SocialTraversalSource).withRemote(connection);
 g.person('marko').aged(29).values('name').toList().
   then(names => console.log(names));
 ----
+
+[[gremlin-javascript-differences]
+=== Differences
+
+In situations where Javascript reserved words and global functions overlap with standard Gremlin steps and tokens, those
+bits of conflicting Gremlin get an underscore appended as a suffix:
+
+*Steps* - <<from-step,from_()>>, <<in-step,in_()>>, <<with-step,with_()>>


[tinkerpop] 04/04: Merge branch 'tp34'

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit ad8d663ffd957df3724c7aa8fe8bb4f893d76557
Merge: aee038f 8fca63b
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Fri Jul 26 07:27:34 2019 -0400

    Merge branch 'tp34'

 CHANGELOG.asciidoc                                 |  2 +
 docs/src/reference/gremlin-variants.asciidoc       | 26 ++++++-
 .../apache/tinkerpop/gremlin/server/Context.java   | 47 ++++++++++-
 .../tinkerpop/gremlin/server/OpProcessor.java      |  4 +-
 .../gremlin/server/ResponseHandlerContext.java     |  4 +-
 .../gremlin/server/handler/OpExecutorHandler.java  |  5 +-
 .../gremlin/server/handler/OpSelectorHandler.java  |  2 +-
 .../server/handler/SaslAuthenticationHandler.java  |  1 +
 .../gremlin/server/op/AbstractEvalOpProcessor.java | 90 ++++++++++------------
 .../gremlin/server/op/AbstractOpProcessor.java     | 85 +++++++++++++-------
 .../server/op/session/SessionOpProcessor.java      |  9 ++-
 .../server/op/standard/StandardOpProcessor.java    |  2 +-
 .../server/op/traversal/TraversalOpProcessor.java  | 75 +++++++++---------
 ...nseHandlerContextTest.java => ContextTest.java} | 33 ++++----
 .../gremlin/server/ResponseHandlerContextTest.java | 73 +++++++++---------
 .../server/op/AbstractEvalOpProcessorTest.java     | 15 ++--
 .../gremlin/server/op/AbstractOpProcessorTest.java |  7 +-
 17 files changed, 286 insertions(+), 194 deletions(-)



[tinkerpop] 03/04: Merge branch 'tp33' into tp34

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 8fca63bac5b3e62e29d5707e159458b49c517f67
Merge: 22bda83 af87c3d
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Fri Jul 26 07:27:23 2019 -0400

    Merge branch 'tp33' into tp34

 CHANGELOG.asciidoc                                 |  2 +
 .../apache/tinkerpop/gremlin/server/Context.java   | 47 ++++++++++-
 .../tinkerpop/gremlin/server/OpProcessor.java      |  4 +-
 .../gremlin/server/ResponseHandlerContext.java     |  4 +-
 .../gremlin/server/handler/OpExecutorHandler.java  |  5 +-
 .../gremlin/server/handler/OpSelectorHandler.java  |  2 +-
 .../server/handler/SaslAuthenticationHandler.java  |  1 +
 .../gremlin/server/op/AbstractEvalOpProcessor.java | 90 ++++++++++------------
 .../gremlin/server/op/AbstractOpProcessor.java     | 85 +++++++++++++-------
 .../server/op/session/SessionOpProcessor.java      |  9 ++-
 .../server/op/standard/StandardOpProcessor.java    |  2 +-
 .../server/op/traversal/TraversalOpProcessor.java  | 75 +++++++++---------
 ...nseHandlerContextTest.java => ContextTest.java} | 33 ++++----
 .../gremlin/server/ResponseHandlerContextTest.java | 73 +++++++++---------
 .../server/op/AbstractEvalOpProcessorTest.java     | 15 ++--
 .../gremlin/server/op/AbstractOpProcessorTest.java |  7 +-
 16 files changed, 262 insertions(+), 192 deletions(-)

diff --cc gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
index 23ec397,79d1171..798ee6b
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
@@@ -310,13 -298,13 +298,13 @@@ public abstract class AbstractEvalOpPro
                      // presented itself where the "Method code too large!" comes with other compilation errors so
                      // it seems that this message trumps other compilation errors to some reasonable degree that ends
                      // up being favorable for this problem
 -                    if (t instanceof MultipleCompilationErrorsException && t.getMessage().contains("Method code too large!") &&
 +                    if (t instanceof MultipleCompilationErrorsException && t.getMessage().contains("Method too large") &&
                              ((MultipleCompilationErrorsException) t).getErrorCollector().getErrorCount() == 1) {
 -                        final String errorMessage = String.format("The Gremlin statement that was submitted exceed the maximum compilation size allowed by the JVM, please split it into multiple smaller statements - %s", trimMessage(msg));
 +                        final String errorMessage = String.format("The Gremlin statement that was submitted exceeds the maximum compilation size allowed by the JVM, please split it into multiple smaller statements - %s", trimMessage(msg));
                          logger.warn(errorMessage);
-                         rhc.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION)
-                                 .statusMessage(errorMessage)
-                                 .statusAttributeException(t).create());
+                         ctx.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION)
+                                                          .statusMessage(errorMessage)
+                                                          .statusAttributeException(t).create());
                      } else {
                          final String errorMessage =  (t.getMessage() == null) ? t.toString() : t.getMessage();
                          logger.warn(String.format("Exception processing a script on request [%s].", msg), t);
diff --cc gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java
index 0b279a3,11540d8..ea03f03
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java
@@@ -64,28 -65,32 +64,25 @@@ public abstract class AbstractOpProcess
      }
  
      /**
 -     * A variant of {@link #handleIterator(Context, Iterator)} that is suitable for use in situations when multiple
 -     * threads may produce {@link ResponseStatusCode#isFinalResponse() final} response messages concurrently.
+      * @deprecated As of release 3.3.8, not replaced.
+      */
+     @Deprecated
 -    protected void handleIterator(final ResponseHandlerContext rhc, final Iterator itty) throws TimeoutException, InterruptedException {
++    protected void handleIterator(final ResponseHandlerContext rhc, final Iterator itty) throws InterruptedException {
+         handleIterator(rhc.getContext(), itty);
+     }
+ 
+     /**
 -     * Provides a generic way of iterating a result set back to the client. Implementers should respect the
 -     * {@link Settings#serializedResponseTimeout} configuration and break the serialization process if
 -     * it begins to take too long to do so, throwing a {@link java.util.concurrent.TimeoutException} in such
 -     * cases.
 +     * Provides a generic way of iterating a result set back to the client.
       *
 -     * @param context The Gremlin Server {@link Context} which enforces that only a single final response is
 -     *            sent to the client.
 +     * @param context The Gremlin Server {@link Context} object containing settings, request message, etc.
       * @param itty The result to iterator
-      * @see #handleIterator(ResponseHandlerContext, Iterator)
 -     * @throws TimeoutException if the time taken to serialize the entire result set exceeds the allowable time.
       */
 -    protected void handleIterator(final Context context, final Iterator itty) throws TimeoutException, InterruptedException {
 +    protected void handleIterator(final Context context, final Iterator itty) throws InterruptedException {
-         handleIterator(new ResponseHandlerContext(context), itty);
-     }
- 
-     /**
-      * A variant of {@link #handleIterator(Context, Iterator)} that is suitable for use in situations when multiple
-      * threads may produce {@link ResponseStatusCode#isFinalResponse() final} response messages concurrently.
-      * @see #handleIterator(Context, Iterator)
-      */
-     protected void handleIterator(final ResponseHandlerContext rhc, final Iterator itty) throws InterruptedException {
-         final Context context = rhc.getContext();
-         final ChannelHandlerContext ctx = context.getChannelHandlerContext();
+         final ChannelHandlerContext nettyContext = context.getChannelHandlerContext();
          final RequestMessage msg = context.getRequestMessage();
          final Settings settings = context.getSettings();
-         final MessageSerializer serializer = ctx.channel().attr(StateKey.SERIALIZER).get();
-         final boolean useBinary = ctx.channel().attr(StateKey.USE_BINARY).get();
+         final MessageSerializer serializer = nettyContext.channel().attr(StateKey.SERIALIZER).get();
+         final boolean useBinary = nettyContext.channel().attr(StateKey.USE_BINARY).get();
          boolean warnOnce = false;
  
          // sessionless requests are always transaction managed, but in-session requests are configurable.
@@@ -94,14 -99,12 +91,14 @@@
  
          // we have an empty iterator - happens on stuff like: g.V().iterate()
          if (!itty.hasNext()) {
-             final Map<String, Object> attributes = generateStatusAttributes(ctx, msg, ResponseStatusCode.NO_CONTENT, itty, settings);
++            final Map<String, Object> attributes = generateStatusAttributes(nettyContext, msg, ResponseStatusCode.NO_CONTENT, itty, settings);
              // as there is nothing left to iterate if we are transaction managed then we should execute a
              // commit here before we send back a NO_CONTENT which implies success
              if (managedTransactionsForRequest) attemptCommit(msg, context.getGraphManager(), settings.strictTransactionManagement);
-             rhc.writeAndFlush(ResponseMessage.build(msg)
+             context.writeAndFlush(ResponseMessage.build(msg)
 -                                             .code(ResponseStatusCode.NO_CONTENT)
 -                                             .create());
 +                    .code(ResponseStatusCode.NO_CONTENT)
 +                    .statusAttributes(attributes)
 +                    .create());
              return;
          }
  
@@@ -148,9 -155,7 +145,9 @@@
                      // thread that processed the eval of the script so, we have to push serialization down into that
                      Frame frame = null;
                      try {
-                         frame = makeFrame(rhc, msg, serializer, useBinary, aggregate, code,
-                                 generateResultMetaData(ctx, msg, code, itty, settings),
-                                 generateStatusAttributes(ctx, msg, code, itty, settings));
 -                        frame = makeFrame(context, msg, serializer, useBinary, aggregate, code, generateMetaData(nettyContext, msg, code, itty));
++                        frame = makeFrame(context, msg, serializer, useBinary, aggregate, code,
++                                generateResultMetaData(nettyContext, msg, code, itty, settings),
++                                generateStatusAttributes(nettyContext, msg, code, itty, settings));
                      } catch (Exception ex) {
                          // a frame may use a Bytebuf which is a countable release - if it does not get written
                          // downstream it needs to be released here
@@@ -278,30 -272,38 +275,62 @@@
      }
  
      /**
-      * Caution: {@link #makeFrame(ResponseHandlerContext, RequestMessage, MessageSerializer, boolean, List, ResponseStatusCode, Map, Map)}
-      * should be used instead of this method whenever a {@link ResponseHandlerContext} is available.
+      * @deprecated As of release 3.3.8, replaced by {@link #makeFrame(Context, RequestMessage, MessageSerializer, boolean, List, ResponseStatusCode, Map)}.
       */
+     @Deprecated
      protected static Frame makeFrame(final ChannelHandlerContext ctx, final RequestMessage msg,
                                       final MessageSerializer serializer, final boolean useBinary, final List<Object> aggregate,
 -                                     final ResponseStatusCode code, final Map<String,Object> responseMetaData) throws Exception {
 +                                     final ResponseStatusCode code, final Map<String,Object> responseMetaData,
 +                                     final Map<String,Object> statusAttributes) throws Exception {
          final Context context = new Context(msg, ctx, null, null, null, null); // dummy context, good only for writing response messages to the channel
          final ResponseHandlerContext rhc = new ResponseHandlerContext(context);
 -        return makeFrame(rhc, msg, serializer, useBinary, aggregate, code, responseMetaData);
 +        return makeFrame(rhc, msg, serializer, useBinary, aggregate, code, responseMetaData, statusAttributes);
      }
  
+     /**
+      * @deprecated As of release 3.3.8, replaced by {@link #makeFrame(Context, RequestMessage, MessageSerializer, boolean, List, ResponseStatusCode, Map)}.
+      */
+     @Deprecated
+     protected static Frame makeFrame(final ResponseHandlerContext rhc, final RequestMessage msg,
+                                      final MessageSerializer serializer, final boolean useBinary, final List<Object> aggregate,
+                                      final ResponseStatusCode code, final Map<String,Object> responseMetaData) throws Exception {
+         return makeFrame(rhc.getContext(), msg, serializer, useBinary,aggregate, code, responseMetaData);
+     }
+ 
++    /**
++     * @deprecated As of release 3.3.8, replaced by {@link #makeFrame(Context, RequestMessage, MessageSerializer, boolean, List, ResponseStatusCode, Map)}.
++     */
++    @Deprecated
 +    protected static Frame makeFrame(final ResponseHandlerContext rhc, final RequestMessage msg,
 +                                     final MessageSerializer serializer, final boolean useBinary, final List<Object> aggregate,
 +                                     final ResponseStatusCode code, final Map<String,Object> responseMetaData,
 +                                     final Map<String,Object> statusAttributes) throws Exception {
-         final ChannelHandlerContext ctx = rhc.getContext().getChannelHandlerContext();
++        return makeFrame(rhc.getContext(), msg, serializer, useBinary,aggregate, code, responseMetaData, statusAttributes);
++    }
++
++    /**
++     * @deprecated As of release 3.4.3, replaced by {@link #makeFrame(Context, RequestMessage, MessageSerializer, boolean, List, ResponseStatusCode, Map)}.
++     */
++    @Deprecated
+     protected static Frame makeFrame(final Context ctx, final RequestMessage msg,
+                                      final MessageSerializer serializer, final boolean useBinary, final List<Object> aggregate,
+                                      final ResponseStatusCode code, final Map<String,Object> responseMetaData) throws Exception {
++        return makeFrame(ctx, msg, serializer, useBinary,aggregate, code, responseMetaData, Collections.emptyMap());
++    }
++
++    protected static Frame makeFrame(final Context ctx, final RequestMessage msg,
++                                     final MessageSerializer serializer, final boolean useBinary, final List<Object> aggregate,
++                                     final ResponseStatusCode code, final Map<String,Object> responseMetaData,
++                                     final Map<String,Object> statusAttributes) throws Exception {
          try {
+             final ChannelHandlerContext nettyContext = ctx.getChannelHandlerContext();
+ 
              if (useBinary) {
                  return new Frame(serializer.serializeResponseAsBinary(ResponseMessage.build(msg)
                          .code(code)
 +                        .statusAttributes(statusAttributes)
                          .responseMetaData(responseMetaData)
-                         .result(aggregate).create(), ctx.alloc()));
+                         .result(aggregate).create(), nettyContext.alloc()));
              } else {
                  // the expectation is that the GremlinTextRequestDecoder will have placed a MessageTextSerializer
                  // instance on the channel.
diff --cc gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
index 234826b,26cf921..34f7b75
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
@@@ -320,11 -321,19 +320,11 @@@ public class TraversalOpProcessor exten
                          }
  
                          handleIterator(context, new SideEffectIterator(sideEffects.get(sideEffectKey.get()), sideEffectKey.get()));
 -                    } catch (TimeoutException ex) {
 -                        final String errorMessage = String.format("Response iteration exceeded the configured threshold for request [%s] - %s", msg.getRequestId(), ex.getMessage());
 -                        logger.warn(errorMessage);
 -                        context.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR_TIMEOUT)
 -                                                             .statusMessage(errorMessage)
 -                                                             .statusAttributeException(ex).create());
 -                        onError(graph, context);
 -                        return;
                      } catch (Exception ex) {
                          logger.warn(String.format("Exception processing a side-effect on iteration for request [%s].", msg.getRequestId()), ex);
-                         ctx.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR)
-                                 .statusMessage(ex.getMessage())
-                                 .statusAttributeException(ex).create());
+                         context.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR)
+                                                              .statusMessage(ex.getMessage())
+                                                              .statusAttributeException(ex).create());
                          onError(graph, context);
                          return;
                      }
@@@ -501,19 -503,17 +500,19 @@@
  
          // we have an empty iterator - happens on stuff like: g.V().iterate()
          if (!itty.hasNext()) {
-             final Map<String, Object> attributes = generateStatusAttributes(ctx, msg, ResponseStatusCode.NO_CONTENT, itty, settings);
 -            // as there is nothing left to iterate if we are transaction managed then we should execute a
 -            // commit here before we send back a NO_CONTENT which implies success
 -            onTraversalSuccess(graph, context);
++            final Map<String, Object> attributes = generateStatusAttributes(nettyContext, msg, ResponseStatusCode.NO_CONTENT, itty, settings);
              // if it was a g.V().iterate(), then be sure to add the side-effects to the cache
              if (itty instanceof TraverserIterator &&
                      !((TraverserIterator)itty).getTraversal().getSideEffects().isEmpty()) {
                  cache.put(msg.getRequestId(), ((TraverserIterator)itty).getTraversal().getSideEffects());
              }
 +            // as there is nothing left to iterate if we are transaction managed then we should execute a
 +            // commit here before we send back a NO_CONTENT which implies success
 +            onTraversalSuccess(graph, context);
-             ctx.writeAndFlush(ResponseMessage.build(msg)
+             context.writeAndFlush(ResponseMessage.build(msg)
 -                                                 .code(ResponseStatusCode.NO_CONTENT)
 -                                                 .create());
 +                    .code(ResponseStatusCode.NO_CONTENT)
 +                    .statusAttributes(attributes)
 +                    .create());
              return;
          }
  
@@@ -558,12 -558,10 +557,12 @@@
                      // serialize here because in sessionless requests the serialization must occur in the same
                      // thread as the eval.  as eval occurs in the GremlinExecutor there's no way to get back to the
                      // thread that processed the eval of the script so, we have to push serialization down into that
-                     final Map<String, Object> metadata = generateResultMetaData(ctx, msg, code, itty, settings);
-                     final Map<String, Object> statusAttrb = generateStatusAttributes(ctx, msg, code, itty, settings);
 -                    final Map<String, Object> metadata = generateMetaData(nettyContext, msg, code, itty);
++                    final Map<String, Object> metadata = generateResultMetaData(nettyContext, msg, code, itty, settings);
++                    final Map<String, Object> statusAttrb = generateStatusAttributes(nettyContext, msg, code, itty, settings);
                      Frame frame = null;
                      try {
-                         frame = makeFrame(ctx, msg, serializer, useBinary, aggregate, code,
 -                        frame = makeFrame(context, msg, serializer, useBinary, aggregate, code, metadata);
++                        frame = makeFrame(context, msg, serializer, useBinary, aggregate, code,
 +                                          metadata, statusAttrb);
                      } catch (Exception ex) {
                          // a frame may use a Bytebuf which is a countable release - if it does not get written
                          // downstream it needs to be released here
diff --cc gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessorTest.java
index 8a3cc6d,1852d31..eaba1c6
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessorTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessorTest.java
@@@ -30,11 -30,11 +30,12 @@@ import static org.junit.Assert.assertEq
  import static org.junit.Assert.fail;
  
  public class AbstractOpProcessorTest {
 +
      @Test
-     public void alternativeMakeFrameMethodShouldRedirectCorrectly() throws Exception {
-         final ChannelHandlerContext ctx = Mockito.mock(ChannelHandlerContext.class);
+     public void makeFrameMethodTest() throws Exception {
          final RequestMessage request = RequestMessage.build("test").create();
+         final Context ctx = Mockito.mock(Context.class);
+ 
          final ArgumentCaptor<ResponseMessage> responseCaptor = ArgumentCaptor.forClass(ResponseMessage.class);
  
          try {