You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by di...@apache.org on 2020/10/08 22:51:13 UTC

[tinkerpop] branch 3.4-dev updated: TINKERPOP-2410 Release server threads waiting on connection if the connection is dead. (#1318)

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

divijv pushed a commit to branch 3.4-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/3.4-dev by this push:
     new a454d52  TINKERPOP-2410 Release server threads waiting on connection if the connection is dead.  (#1318)
a454d52 is described below

commit a454d52054841c97ee666d4237bb1554bef5a521
Author: Divij Vaidya <di...@amazon.com>
AuthorDate: Thu Oct 8 15:51:06 2020 -0700

    TINKERPOP-2410 Release server threads waiting on connection if the connection is dead.  (#1318)
---
 CHANGELOG.asciidoc                                               | 1 +
 .../apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java  | 9 +++++++++
 .../gremlin/server/op/traversal/TraversalOpProcessor.java        | 7 +++++++
 3 files changed, 17 insertions(+)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 8a228e4..f2d430e 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -38,6 +38,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 * Avoid creating unnecessary detached objects in JVM.
 * Added support for `TraversalStrategy` usage in Javascript.
 * Added `Traversal.getTraverserSetSupplier()` to allow providers to supply their own `TraverserSet` instances.
+* Release server threads waiting on connection if the connection is dead.
 
 [[release-3-4-8]]
 === TinkerPop 3.4.8 (Release Date: August 3, 2020)
diff --git 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
index 6254b1d..8c7ec55 100644
--- 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
@@ -134,6 +134,15 @@ public abstract class AbstractOpProcessor implements OpProcessor {
             // while waiting for the client to catch up
             if (aggregate.size() < resultIterationBatchSize && itty.hasNext() && !forceFlush) aggregate.add(itty.next());
 
+            // Don't keep executor busy if client has already given up; there is no way to catch up if the channel is
+            // not active, and hence we should break the loop.
+            if (!nettyContext.channel().isActive()) {
+                if (managedTransactionsForRequest) {
+                    attemptRollback(msg, context.getGraphManager(), settings.strictTransactionManagement);
+                }
+                break;
+            }
+
             // send back a page of results if batch size is met or if it's the end of the results being iterated.
             // also check writeability of the channel to prevent OOME for slow clients.
             //
diff --git 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
index 418c66c..07ca83b 100644
--- 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
@@ -558,6 +558,13 @@ public class TraversalOpProcessor extends AbstractOpProcessor {
             // while waiting for the client to catch up
             if (aggregate.size() < resultIterationBatchSize && itty.hasNext() && !forceFlush) aggregate.add(itty.next());
 
+            // Don't keep executor busy if client has already given up; there is no way to catch up if the channel is
+            // not active, and hence we should break the loop.
+            if (!nettyContext.channel().isActive()) {
+                onError(graph, context);
+                break;
+            }
+
             // send back a page of results if batch size is met or if it's the end of the results being iterated.
             // also check writeability of the channel to prevent OOME for slow clients.
             //