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 2016/08/01 17:10:44 UTC
tinkerpop git commit: TINKERPOP-1392 Remove support for Java
serialized Traversal.
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1278 8dd021192 -> 688e3f551
TINKERPOP-1392 Remove support for Java serialized Traversal.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/688e3f55
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/688e3f55
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/688e3f55
Branch: refs/heads/TINKERPOP-1278
Commit: 688e3f551c260f86c87c55c48863052b2733a3ff
Parents: 8dd0211
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Mon Aug 1 13:09:24 2016 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Mon Aug 1 13:09:24 2016 -0400
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../upgrade/release-3.2.x-incubating.asciidoc | 20 +++
.../apache/tinkerpop/gremlin/driver/Client.java | 21 +---
.../driver/remote/DriverRemoteConnection.java | 25 +---
.../op/traversal/TraversalOpProcessor.java | 125 +------------------
.../server/GremlinResultSetIntegrateTest.java | 10 +-
6 files changed, 33 insertions(+), 169 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/688e3f55/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 2714469..25666dc 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
TinkerPop 3.2.2 (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Removed support for submitting a Java serialized `Traversal` to Gremlin Server.
* Fixed a potential leak of a `ReferenceCounted` resource in Gremlin Server.
* Added class registrations for `Map.Entry` implementations to `GryoMapper`.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/688e3f55/docs/src/upgrade/release-3.2.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.2.x-incubating.asciidoc b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
index f85012c..fa55403 100644
--- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
@@ -22,6 +22,26 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
*Nine Inch Gremlins*
+TinkerPop 3.2.2
+---------------
+
+*Release Date: NOT OFFICIALLY RELEASED YET*
+
+Upgrading for Providers
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Driver Providers
+^^^^^^^^^^^^^^^^
+
+Traversal Serialization
++++++++++++++++++++++++
+
+There was an "internal" serialization format in place for `Traversal` which allowed one to be submitted to Gremlin
+Server directly over `RemoteGraph`. That format has been removed completely and is wholly replaced by the non-JVM
+specific approach of serializing `Bytecode`.
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-1392[TINKERPOP-1392]
+
TinkerPop 3.2.1
---------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/688e3f55/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
index 9b8f77f..3716411 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java
@@ -26,7 +26,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.Serializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -133,10 +132,7 @@ public abstract class Client {
/**
* Submit a {@link Traversal} to the server for remote execution.
- *
- * @deprecated As of release 3.2.2, replaced by {@link #submit(Bytecode)}.
*/
- @Deprecated
public ResultSet submit(final Traversal traversal) {
try {
return submitAsync(traversal).get();
@@ -149,10 +145,7 @@ public abstract class Client {
/**
* An asynchronous version of {@link #submit(Traversal)}.
- *
- * @deprecated As of release 3.2.2, replaced by {@link #submitAsync(Bytecode)}.
*/
- @Deprecated
public CompletableFuture<ResultSet> submitAsync(final Traversal traversal) {
throw new UnsupportedOperationException("This implementation does not support Traversal submission - use a sessionless Client created with from the alias() method");
}
@@ -564,19 +557,7 @@ public abstract class Client {
@Override
public CompletableFuture<ResultSet> submitAsync(final Traversal traversal) {
- final byte[] serializedTraversal;
- try {
- serializedTraversal = Serializer.serializeObject(traversal);
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- }
-
- try {
- return submitAsync(buildMessage(RequestMessage.build(Tokens.OPS_TRAVERSE)
- .processor("traversal").addArg(Tokens.ARGS_GREMLIN, serializedTraversal)).create());
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- }
+ return submitAsync(traversal.asAdmin().getBytecode());
}
@Override
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/688e3f55/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
index 9d1a27d..4e276e0 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
@@ -47,19 +47,8 @@ public class DriverRemoteConnection implements RemoteConnection {
public static final String GREMLIN_REMOTE_GRAPH_DRIVER_CLUSTERFILE = "gremlin.remoteGraph.driver.clusterFile";
- /**
- * @deprecated As of release 3.2.2, replaced by {@link #GREMLIN_REMOTE_GRAPH_DRIVER_SOURCENAME}.
- */
- @Deprecated
- public static final String GREMLIN_REMOTE_GRAPH_DRIVER_GRAPHNAME = "gremlin.remoteGraph.driver.graphName";
public static final String GREMLIN_REMOTE_GRAPH_DRIVER_SOURCENAME = "gremlin.remoteGraph.driver.sourceName";
-
- /**
- * @deprecated As of release 3.2.2, replaced by {@link #GREMLIN_REMOTE_GRAPH_DRIVER_SOURCENAME}.
- */
- @Deprecated
- private static final String DEFAULT_GRAPH = "graph";
private static final String DEFAULT_TRAVERSAL_SOURCE = "g";
private final Client client;
@@ -73,10 +62,7 @@ public class DriverRemoteConnection implements RemoteConnection {
if (conf.containsKey(GREMLIN_REMOTE_GRAPH_DRIVER_CLUSTERFILE) && conf.containsKey("clusterConfiguration"))
throw new IllegalStateException(String.format("A configuration should not contain both '%s' and 'clusterConfiguration'", GREMLIN_REMOTE_GRAPH_DRIVER_CLUSTERFILE));
- if (conf.containsKey(GREMLIN_REMOTE_GRAPH_DRIVER_GRAPHNAME))
- connectionGraphName = conf.getString(GREMLIN_REMOTE_GRAPH_DRIVER_GRAPHNAME, DEFAULT_GRAPH);
- else
- connectionGraphName = conf.getString(GREMLIN_REMOTE_GRAPH_DRIVER_SOURCENAME, DEFAULT_TRAVERSAL_SOURCE);
+ connectionGraphName = conf.getString(GREMLIN_REMOTE_GRAPH_DRIVER_SOURCENAME, DEFAULT_TRAVERSAL_SOURCE);
try {
final Cluster cluster;
@@ -105,10 +91,7 @@ public class DriverRemoteConnection implements RemoteConnection {
* This constructor is largely just for unit testing purposes and should not typically be used externally.
*/
DriverRemoteConnection(final Cluster cluster, final Configuration conf) {
- if (conf.containsKey(GREMLIN_REMOTE_GRAPH_DRIVER_GRAPHNAME))
- connectionGraphName = conf.getString(GREMLIN_REMOTE_GRAPH_DRIVER_GRAPHNAME, DEFAULT_GRAPH);
- else
- connectionGraphName = conf.getString(GREMLIN_REMOTE_GRAPH_DRIVER_SOURCENAME, DEFAULT_TRAVERSAL_SOURCE);
+ connectionGraphName = conf.getString(GREMLIN_REMOTE_GRAPH_DRIVER_SOURCENAME, DEFAULT_TRAVERSAL_SOURCE);
client = cluster.connect(Client.Settings.build().unrollTraversers(false).create()).alias(connectionGraphName);
tryCloseCluster = false;
@@ -121,7 +104,7 @@ public class DriverRemoteConnection implements RemoteConnection {
* {@link RemoteConnection} to a graph on the server named "graph".
*/
public static DriverRemoteConnection using(final Cluster cluster) {
- return using(cluster, "graph");
+ return using(cluster, DEFAULT_TRAVERSAL_SOURCE);
}
/**
@@ -138,7 +121,7 @@ public class DriverRemoteConnection implements RemoteConnection {
* this method will bind the {@link RemoteConnection} to a graph on the server named "graph".
*/
public static DriverRemoteConnection using(final String clusterConfFile) {
- return using(clusterConfFile, "graph");
+ return using(clusterConfFile, DEFAULT_TRAVERSAL_SOURCE);
}
/**
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/688e3f55/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
----------------------------------------------------------------------
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 5f0773e..2f0714a 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
@@ -28,10 +28,6 @@ import org.apache.tinkerpop.gremlin.groovy.engine.ScriptEngines;
import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
import org.apache.tinkerpop.gremlin.server.Context;
import org.apache.tinkerpop.gremlin.server.GraphManager;
import org.apache.tinkerpop.gremlin.server.GremlinServer;
@@ -41,7 +37,6 @@ import org.apache.tinkerpop.gremlin.server.op.OpProcessorException;
import org.apache.tinkerpop.gremlin.server.util.MetricManager;
import org.apache.tinkerpop.gremlin.server.util.TraversalIterator;
import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.util.Serializer;
import org.apache.tinkerpop.gremlin.util.function.ThrowingConsumer;;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -50,7 +45,6 @@ import javax.script.SimpleBindings;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeoutException;
@@ -88,20 +82,8 @@ public class TraversalOpProcessor extends AbstractOpProcessor {
final ThrowingConsumer<Context> op;
switch (message.getOp()) {
- case Tokens.OPS_TRAVERSE:
- validateTraversalRequest(ctx, message);
-
- final Optional<Map<String, String>> traverseAliases = message.optionalArgs(Tokens.ARGS_ALIASES);
- final Map.Entry<String, String> traverserKv = traverseAliases.get().entrySet().iterator().next();
- if (!ctx.getGraphManager().getGraphs().containsKey(traverserKv.getValue())) {
- final String msg = String.format("The graph [%s] for alias [%s] is not configured on the server.", traverserKv.getValue(), traverserKv.getKey());
- throw new OpProcessorException(msg, ResponseMessage.build(message).code(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS).statusMessage(msg).create());
- }
-
- op = this::iterateSerializedTraversal;
- break;
case Tokens.OPS_BYTECODE:
- final Map<String, String> bytecodeAliases = validateTraversalRequest(ctx, message);
+ final Map<String, String> bytecodeAliases = validateTraversalRequest(message);
final Map.Entry<String, String> bytecodeKv = bytecodeAliases.entrySet().iterator().next();
if (!ctx.getGraphManager().getTraversalSources().containsKey(bytecodeKv.getValue())) {
final String msg = String.format("The traversal source [%s] for alias [%s] is not configured on the server.", bytecodeKv.getValue(), bytecodeKv.getKey());
@@ -121,7 +103,7 @@ public class TraversalOpProcessor extends AbstractOpProcessor {
return op;
}
- private static Map<String,String> validateTraversalRequest(final Context ctx, final RequestMessage message) throws OpProcessorException {
+ private static Map<String,String> validateTraversalRequest(final RequestMessage message) throws OpProcessorException {
if (!message.optionalArgs(Tokens.ARGS_GREMLIN).isPresent()) {
final String msg = String.format("A message with an [%s] op code requires a [%s] argument.", Tokens.OPS_TRAVERSE, Tokens.ARGS_GREMLIN);
throw new OpProcessorException(msg, ResponseMessage.build(message).code(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS).statusMessage(msg).create());
@@ -233,107 +215,4 @@ public class TraversalOpProcessor extends AbstractOpProcessor {
return metaData;
}
-
- private void iterateSerializedTraversal(final Context context) throws OpProcessorException {
- final RequestMessage msg = context.getRequestMessage();
- logger.debug("Traversal request {} for in thread {}", msg.getRequestId(), Thread.currentThread().getName());
-
- final byte[] serializedTraversal = (byte[]) msg.getArgs().get(Tokens.ARGS_GREMLIN);
-
- // earlier validation in selection of this op method should free us to cast this without worry
- final Map<String, String> aliases = (Map<String, String>) msg.optionalArgs(Tokens.ARGS_ALIASES).get();
-
- final Traversal.Admin<?, ?> traversal;
- try {
- traversal = (Traversal.Admin) Serializer.deserializeObject(serializedTraversal);
- } catch (Exception ex) {
- throw new OpProcessorException("Could not deserialize the Traversal instance",
- ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR_SERIALIZATION)
- .statusMessage(ex.getMessage()).create());
- }
-
- if (traversal.isLocked())
- throw new OpProcessorException("Locked Traversals cannot be processed by the server",
- ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR_SERIALIZATION)
- .statusMessage("Locked Traversals cannot be processed by the server").create());
-
- final Timer.Context timerContext = traversalOpTimer.time();
- try {
- final ChannelHandlerContext ctx = context.getChannelHandlerContext();
- final GraphManager graphManager = context.getGraphManager();
- final String graphName = aliases.entrySet().iterator().next().getValue();
- final Graph graph = graphManager.getGraphs().get(graphName);
- final boolean supportsTransactions = graph.features().graph().supportsTransactions();
-
- configureTraversal(traversal, graph);
-
- context.getGremlinExecutor().getExecutorService().submit(() -> {
- try {
- if (supportsTransactions && graph.tx().isOpen()) graph.tx().rollback();
-
- try {
- // compile the traversal - without it getEndStep() has nothing in it
- traversal.applyStrategies();
- handleIterator(context, new DetachingIterator<>(traversal));
- } 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);
- ctx.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR_TIMEOUT).statusMessage(errorMessage).create());
- if (supportsTransactions && graph.tx().isOpen()) graph.tx().rollback();
- return;
- } catch (Exception ex) {
- logger.warn(String.format("Exception processing a Traversal on iteration for request [%s].", msg.getRequestId()), ex);
- ctx.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR).statusMessage(ex.getMessage()).create());
- if (supportsTransactions && graph.tx().isOpen()) graph.tx().rollback();
- return;
- }
-
- if (graph.features().graph().supportsTransactions()) graph.tx().commit();
- } catch (Exception ex) {
- logger.warn(String.format("Exception processing a Traversal on request [%s].", msg.getRequestId()), ex);
- ctx.writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR).statusMessage(ex.getMessage()).create());
- if (graph.features().graph().supportsTransactions() && graph.tx().isOpen()) graph.tx().rollback();
- } finally {
- timerContext.stop();
- }
- });
-
- } catch (Exception ex) {
- timerContext.stop();
- throw new OpProcessorException("Could not iterate the Traversal instance",
- ResponseMessage.build(msg).code(ResponseStatusCode.SERVER_ERROR).statusMessage(ex.getMessage()).create());
- }
- }
-
- private static void configureTraversal(final Traversal.Admin<?, ?> traversal, final Graph graph) {
- traversal.setGraph(graph);
- final List<TraversalStrategy<?>> strategies = TraversalStrategies.GlobalCache.getStrategies(graph.getClass()).toList();
- final TraversalStrategy[] arrayOfStrategies = new TraversalStrategy[strategies.size()];
- strategies.toArray(arrayOfStrategies);
- traversal.getStrategies().addStrategies(arrayOfStrategies);
- }
-
- static class DetachingIterator<E> implements Iterator<Traverser.Admin<E>> {
-
- private Iterator<Traverser.Admin<E>> inner;
- private HaltedTraverserStrategy haltedTraverserStrategy;
-
- public DetachingIterator(final Traversal.Admin<?, E> traversal) {
- this.inner = traversal.getEndStep();
- this.haltedTraverserStrategy = traversal.getStrategies().getStrategy(HaltedTraverserStrategy.class).orElse(
- Boolean.valueOf(System.getProperty("is.testing", "false")) ?
- HaltedTraverserStrategy.detached() :
- HaltedTraverserStrategy.reference());
- }
-
- @Override
- public boolean hasNext() {
- return this.inner.hasNext();
- }
-
- @Override
- public Traverser.Admin<E> next() {
- return this.haltedTraverserStrategy.halt(this.inner.next());
- }
- }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/688e3f55/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
index 3a4ab27..956a87c 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
@@ -25,8 +25,8 @@ import org.apache.tinkerpop.gremlin.driver.Result;
import org.apache.tinkerpop.gremlin.driver.ResultSet;
import org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0;
import org.apache.tinkerpop.gremlin.driver.ser.Serializers;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.step.util.BulkedResult;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -96,7 +96,7 @@ public class GremlinResultSetIntegrateTest extends AbstractGremlinServerIntegrat
public void shouldHandleVertexResultFromTraversal() throws Exception {
final Graph graph = TinkerGraph.open();
final GraphTraversalSource g = graph.traversal();
- final Client aliased = client.alias("graph");
+ final Client aliased = client.alias("g");
final ResultSet resultSet = aliased.submit(g.V().both().both());
final List<Result> results = resultSet.all().get();
@@ -108,7 +108,7 @@ public class GremlinResultSetIntegrateTest extends AbstractGremlinServerIntegrat
public void shouldHandleVertexResultFromTraversalAsTraversersUnrolled() throws Exception {
final Graph graph = TinkerGraph.open();
final GraphTraversalSource g = graph.traversal();
- final Client aliased = client.alias("graph");
+ final Client aliased = client.alias("g");
final ResultSet resultSetUnrolled = aliased.submit(g.V().both().barrier().both().barrier());
final List<Result> results = resultSetUnrolled.all().get();
@@ -121,11 +121,11 @@ public class GremlinResultSetIntegrateTest extends AbstractGremlinServerIntegrat
final Graph graph = TinkerGraph.open();
final GraphTraversalSource g = graph.traversal();
final Client clientWithUnrolling = cluster.connect(Client.Settings.build().unrollTraversers(false).create());
- final Client aliased = clientWithUnrolling.alias("graph");
+ final Client aliased = clientWithUnrolling.alias("g");
final ResultSet resultSet = aliased.submit(g.V().both().barrier().both().barrier());
final List<Result> results = resultSet.all().get();
- assertThat(results.get(0).getObject(), CoreMatchers.instanceOf(Traverser.class));
+ assertThat(results.get(0).getObject(), CoreMatchers.instanceOf(BulkedResult.class));
assertEquals(6, results.size());
aliased.close();