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 f9d702757bbaf07a09ab13d534f2071a729610ee Author: Stephen Mallette <[email protected]> AuthorDate: Mon Dec 17 14:51:40 2018 -0500 Added Cluster.using(Client) CTR --- CHANGELOG.asciidoc | 1 + docs/src/reference/gremlin-applications.asciidoc | 15 ++++++----- .../driver/remote/DriverRemoteConnection.java | 30 +++++++++++++++++++++- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 5e6dcb2..d8dc8bf 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -39,6 +39,7 @@ This release also includes changes from <<release-3-2-11, 3.2.11>>. * Changed Java driver to expect a generic `RemoteTraverser` object rather than the specific `DefaultRemoteTraverser`. * Display the remote stack trace in the Gremlin Console when scripts sent to the server fail. * Added `AnonymousTraversalSource` which provides a more unified means of constructing a `TraversalSource`. +* Added `DriverRemoteConnection.using(Client)` to provide users better control over the number of connections being created. * Changed behavior of GraphSON deserializer in gremlin-python such that `g:Set` returns a Python `Set`. * Changed behavior of `iterate()` in Python, Javascript and .NET to send `none()` thus avoiding unnecessary results being returned. * Provided for a configurable class map cache in the `GremlinGroovyScriptEngine` and exposed that in Gremlin Server. diff --git a/docs/src/reference/gremlin-applications.asciidoc b/docs/src/reference/gremlin-applications.asciidoc index 1ddb123..9ba581d 100644 --- a/docs/src/reference/gremlin-applications.asciidoc +++ b/docs/src/reference/gremlin-applications.asciidoc @@ -1075,22 +1075,22 @@ Note the call to `close()` above. The construction of "g" using the properties f `Client` instance that can only be released by "closing" the `GraphTraversalSource`. It is important to take that step to release resources created in that step. -If working with multiple remote `TraversalSource` instances it is more efficient to construct a `Cluster` object and +If working with multiple remote `TraversalSource` instances it is more efficient to construct a `Client` object and then re-use it. [gremlin-groovy] ---- cluster = Cluster.open('conf/remote-objects.yaml') -g = traversal().withRemote(DriverRemoteConnection.using(cluster, "g")) +client = cluster.connect() +g = traversal().withRemote(DriverRemoteConnection.using(client, "g")) g.V().valueMap(true) g.close() cluster.close() ---- -If the `Cluster` instance is supplied externally, as is shown above, then it is not closed implicitly by the close of -"g". Closing "g" will only close the `Client` instance associated with that `TraversalSource`. In this case, the -`Cluster` must also be closed explicitly. Closing "g" and the "cluster" aren't actually both necessary - the close of -a `Cluster` will close all `Client` instance spawned by the `Cluster`. +If the `Client` instance is supplied externally, as is shown above, then it is not closed implicitly by the close of +"g". In this case, the `Client` and `Cluster` must both be closed explicitly. Closing "g" and the "cluster" aren' +t actually both necessary - the close of a `Cluster` will close all `Client` instance spawned by the `Cluster`. IMPORTANT: `RemoteGraph` uses the `TraversalOpProcessor` in Gremlin Server which requires a cache to enable the retrieval of side-effects (if the `Traversal` produces any). That cache can be configured (e.g. controlling eviction @@ -1104,8 +1104,9 @@ Gremlin-Groovy, use `Bindings`. [gremlin-groovy] ---- cluster = Cluster.open('conf/remote-objects.yaml') +client = cluster.connect() b = Bindings.instance() -g = traversal().withRemote(DriverRemoteConnection.using(cluster, "g")) +g = traversal().withRemote(DriverRemoteConnection.using(client, "g")) g.V(b.of('id',1)).out('created').values('name') g.V(b.of('id',4)).out('created').values('name') g.V(b.of('id',4)).out('created').values('name').getBytecode() 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 338a53b..1957fbd 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 @@ -55,6 +55,7 @@ public class DriverRemoteConnection implements RemoteConnection { private final Client client; private final boolean tryCloseCluster; + private final boolean tryCloseClient; private final String remoteTraversalSourceName; private transient Optional<Configuration> conf = Optional.empty(); @@ -81,6 +82,7 @@ public class DriverRemoteConnection implements RemoteConnection { } tryCloseCluster = true; + tryCloseClient = true; this.conf = Optional.of(conf); } @@ -88,6 +90,7 @@ public class DriverRemoteConnection implements RemoteConnection { client = cluster.connect(Client.Settings.build().create()).alias(remoteTraversalSourceName); this.remoteTraversalSourceName = remoteTraversalSourceName; this.tryCloseCluster = tryCloseCluster; + tryCloseClient = true; } /** @@ -98,9 +101,33 @@ public class DriverRemoteConnection implements RemoteConnection { client = cluster.connect(Client.Settings.build().create()).alias(remoteTraversalSourceName); tryCloseCluster = false; + tryCloseClient = true; this.conf = Optional.of(conf); } + private DriverRemoteConnection(final Client client, final String remoteTraversalSourceName) { + this.client = client; + this.remoteTraversalSourceName = remoteTraversalSourceName; + this.tryCloseCluster = false; + tryCloseClient = false; + } + + /** + * Creates a {@link DriverRemoteConnection} using an existing {@link Client} object. The {@link Client} will not + * be closed on calls to {@link #close()}. + */ + public static DriverRemoteConnection using(final Client client) { + return using(client, DEFAULT_TRAVERSAL_SOURCE); + } + + /** + * Creates a {@link DriverRemoteConnection} using an existing {@link Client} object. The {@link Client} will not + * be closed on calls to {@link #close()}. + */ + public static DriverRemoteConnection using(final Client client, final String remoteTraversalSourceName) { + return new DriverRemoteConnection(client, remoteTraversalSourceName); + } + /** * Creates a {@link DriverRemoteConnection} using a new {@link Cluster} instance created from the supplied host * and port and binds it to a remote {@link GraphTraversalSource} named "g". When {@link #close()} is called, @@ -229,7 +256,8 @@ public class DriverRemoteConnection implements RemoteConnection { @Override public void close() throws Exception { try { - client.close(); + if (tryCloseClient) + client.close(); } catch (Exception ex) { throw new RemoteConnectionException(ex); } finally {
