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/06/30 21:16:57 UTC
[1/3] tinkerpop git commit: Fixed bug in driver where the client
would unecessarily replace Connections.
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1352 bc397eca6 -> 989977f67
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/989977f6/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java
index 15b2c4b..8b34038 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java
@@ -50,10 +50,8 @@ import java.util.stream.IntStream;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
@@ -96,6 +94,9 @@ public class GremlinServerSessionIntegrateTest extends AbstractGremlinServerInt
Logger.getRootLogger().setLevel(Level.INFO);
break;
+ case "shouldEnsureSessionBindingsAreThreadSafe":
+ settings.threadPoolWorker = 2;
+ break;
case "shouldExecuteInSessionAndSessionlessWithoutOpeningTransactionWithSingleClient":
case "shouldExecuteInSessionWithTransactionManagement":
case "shouldRollbackOnEvalExceptionForManagedTransaction":
@@ -197,16 +198,15 @@ public class GremlinServerSessionIntegrateTest extends AbstractGremlinServerInt
assertEquals(1, recordingAppender.getMessages().stream()
.filter(msg -> msg.equals("INFO - Session shouldHaveTheSessionTimeout closed\n")).count());
-
}
@Test
public void shouldEnsureSessionBindingsAreThreadSafe() throws Exception {
- final Cluster cluster = Cluster.open();
+ final Cluster cluster = Cluster.build().minInProcessPerConnection(16).maxInProcessPerConnection(64).create();
final Client client = cluster.connect(name.getMethodName());
client.submitAsync("a=100;b=1000;c=10000;null");
- final int requests = 1000;
+ final int requests = 10000;
final List<CompletableFuture<ResultSet>> futures = new ArrayList<>(requests);
IntStream.range(0, requests).forEach(i -> {
try {
@@ -218,12 +218,15 @@ public class GremlinServerSessionIntegrateTest extends AbstractGremlinServerInt
assertEquals(requests, futures.size());
+ int counter = 0;
for(CompletableFuture<ResultSet> f : futures) {
- final Result r = f.get().all().get(3000, TimeUnit.MILLISECONDS).get(0);
+ final Result r = f.get().all().get(30000, TimeUnit.MILLISECONDS).get(0);
assertEquals(11100, r.getInt());
+ counter++;
}
- client.close();
+ assertEquals(requests, counter);
+
cluster.close();
}
[3/3] tinkerpop git commit: Fixed bug in driver where the client
would unecessarily replace Connections.
Posted by sp...@apache.org.
Fixed bug in driver where the client would unecessarily replace Connections.
Replacing the Connection was pretty transparent to the user in most cases, but it wasn't a good practice as there was a cost in doing that which was uncessary since the pool size for a session is always 1.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/989977f6
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/989977f6
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/989977f6
Branch: refs/heads/TINKERPOP-1352
Commit: 989977f67c42d9ab44db3b055db907cd8ee251b0
Parents: bc397ec
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Jun 30 17:14:57 2016 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Jun 30 17:14:57 2016 -0400
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../tinkerpop/gremlin/driver/Connection.java | 5 +-
.../gremlin/driver/ConnectionPool.java | 9 +-
.../gremlin/server/op/session/Session.java | 4 +
.../server/op/session/SessionOpProcessor.java | 1 -
.../server/GremlinDriverIntegrateTest.java | 2070 +++++++++---------
.../GremlinServerSessionIntegrateTest.java | 17 +-
7 files changed, 1058 insertions(+), 1049 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/989977f6/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index f2d4153..7cf46f8 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -31,6 +31,7 @@ TinkerPop 3.1.3 (NOT OFFICIALLY RELEASED YET)
* Defaulted to `Edge.DEFAULT` if no edge label was supplied in GraphML.
* Fixed bug in `IoGraphTest` causing IllegalArgumentException: URI is not hierarchical error for external graph implementations.
* Fixed a bug where timeout functions provided to the `GremlinExecutor` were not executing in the same thread as the script evaluation.
+* Fixed a bug in the driver where many parallel requests over a session would sometimes force a connection to close and replace itself.
* Optimized a few special cases in `RangeByIsCountStrategy`.
* Fixed a bug where the `ConnectionPool` in the driver would not grow with certain configuration options.
* Fixed a bug where pauses in Gremlin Server writing to an overtaxed client would generate unexpected `FastNoSuchElementException` errors.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/989977f6/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java
index cecfbc5..22e48fe 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.gremlin.driver;
import io.netty.handler.codec.CodecException;
-import io.netty.handler.codec.CorruptedFrameException;
import org.apache.tinkerpop.gremlin.driver.exception.ConnectionException;
import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
import io.netty.bootstrap.Bootstrap;
@@ -120,7 +119,9 @@ final class Connection {
* the maximum number of in-process requests less the number of pending responses.
*/
public int availableInProcess() {
- return maxInProcess - pending.size();
+ // no need for a negative available amount - not sure that the pending size can ever exceed maximum, but
+ // better to avoid the negatives that would ensue if it did
+ return Math.max(0, maxInProcess - pending.size());
}
public boolean isDead() {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/989977f6/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java
index 52c6b6a..e51662e 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java
@@ -180,8 +180,10 @@ final class ConnectionPool {
// destroy a connection that exceeds the minimum pool size - it does not have the right to live if it
// isn't busy. replace a connection that has a low available in process count which likely means that
- // it's backing up with requests that might never have returned. if neither of these scenarios are met
- // then let the world know the connection is available.
+ // it's backing up with requests that might never have returned. consider the maxPoolSize in this condition
+ // because if it is equal to 1 (which it is for a session) then there is no need to replace the connection
+ // as it will be responsible for every single request. if neither of these scenarios are met then let the
+ // world know the connection is available.
final int poolSize = connections.size();
final int availableInProcess = connection.availableInProcess();
if (poolSize > minPoolSize && borrowed <= minSimultaneousUsagePerConnection) {
@@ -189,7 +191,7 @@ final class ConnectionPool {
logger.debug("On {} pool size of {} > minPoolSize {} and borrowed of {} <= minSimultaneousUsagePerConnection {} so destroy {}",
host, poolSize, minPoolSize, borrowed, minSimultaneousUsagePerConnection, connection.getConnectionInfo());
destroyConnection(connection);
- } else if (availableInProcess < minInProcess) {
+ } else if (availableInProcess < minInProcess && maxPoolSize > 1) {
if (logger.isDebugEnabled())
logger.debug("On {} availableInProcess {} < minInProcess {} so replace {}", host, availableInProcess, minInProcess, connection.getConnectionInfo());
replaceConnection(connection);
@@ -243,7 +245,6 @@ final class ConnectionPool {
void replaceConnection(final Connection connection) {
logger.debug("Replace {}", connection);
- open.decrementAndGet();
considerNewConnection();
definitelyDestroyConnection(connection);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/989977f6/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/Session.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/Session.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/Session.java
index 0ed2041..33b2752 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/Session.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/Session.java
@@ -100,6 +100,10 @@ public class Session {
return executor;
}
+ public String getSessionId() {
+ return session;
+ }
+
public void touch() {
// if the task of killing is cancelled successfully then reset the session monitor. otherwise this session
// has already been killed and there's nothing left to do with this session.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/989977f6/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
index 451c479..3497169 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/session/SessionOpProcessor.java
@@ -36,7 +36,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.script.Bindings;
-import javax.script.SimpleBindings;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
[2/3] tinkerpop git commit: Fixed bug in driver where the client
would unecessarily replace Connections.
Posted by sp...@apache.org.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/989977f6/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
index 8515e8a..a5bdb2f 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
@@ -129,843 +129,843 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
return settings;
}
- @Test
- public void shouldEventuallySucceedAfterChannelLevelError() throws Exception {
- final Cluster cluster = Cluster.build().addContactPoint("localhost")
- .reconnectIntialDelay(500)
- .reconnectInterval(500)
- .maxContentLength(1024).create();
- final Client client = cluster.connect();
-
- try {
- client.submit("def x = '';(0..<1024).each{x = x + '$it'};x").all().get();
- fail("Request should have failed because it exceeded the max content length allowed");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root.getMessage(), containsString("Max frame length of 1024 has been exceeded."));
- }
-
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldEventuallySucceedAfterMuchFailure() throws Exception {
- final Cluster cluster = Cluster.build().addContactPoint("localhost").create();
- final Client client = cluster.connect();
-
- // tested independently to 10000 iterations but for speed, bumped back to 1000
- IntStream.range(0,1000).forEach(i -> {
- try {
- client.submit("1 + 9 9").all().join().get(0).getInt();
- fail("Should not have gone through due to syntax error");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ResponseException.class));
- }
- });
-
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldEventuallySucceedOnSameServer() throws Exception {
- stopServer();
-
- final Cluster cluster = Cluster.build().addContactPoint("localhost").create();
- final Client client = cluster.connect();
-
- try {
- client.submit("1+1").all().join().get(0).getInt();
- fail("Should not have gone through because the server is not running");
- } catch (Exception i) {
- final Throwable root = ExceptionUtils.getRootCause(i);
- assertThat(root, instanceOf(TimeoutException.class));
- }
-
- startServer();
-
- // default reconnect time is 1 second so wait some extra time to be sure it has time to try to bring it
- // back to life
- TimeUnit.SECONDS.sleep(3);
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldEventuallySucceedWithRoundRobin() throws Exception {
- final String noGremlinServer = "74.125.225.19";
- final Cluster cluster = Cluster.build(noGremlinServer).addContactPoint("localhost").create();
- final Client client = cluster.connect();
-
- // the first host is dead on init. request should succeed on localhost
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldHandleResultsOfAllSizes() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final String script = "g.V().drop().iterate();\n" +
- "\n" +
- "List ids = new ArrayList();\n" +
- "\n" +
- "int ii = 0;\n" +
- "Vertex v = graph.addVertex();\n" +
- "v.property(\"ii\", ii);\n" +
- "v.property(\"sin\", Math.sin(ii));\n" +
- "ids.add(v.id());\n" +
- "\n" +
- "Random rand = new Random();\n" +
- "for (; ii < size; ii++) {\n" +
- " v = graph.addVertex();\n" +
- " v.property(\"ii\", ii);\n" +
- " v.property(\"sin\", Math.sin(ii/5.0));\n" +
- " Vertex u = g.V(ids.get(rand.nextInt(ids.size()))).next();\n" +
- " v.addEdge(\"linked\", u);\n" +
- " ids.add(u.id());\n" +
- " ids.add(v.id());\n" +
- "}\n" +
- "g.V()";
-
- final List<Integer> sizes = Arrays.asList(1, 10, 20, 50, 75, 100, 250, 500, 750, 1000, 5000, 10000);
- for (Integer size : sizes) {
- final Map<String, Object> params = new HashMap<>();
- params.put("size", size - 1);
- final ResultSet results = client.submit(script, params);
-
- assertEquals(size.intValue(), results.all().get().size());
- }
-
- cluster.close();
- }
-
- @Test
- public void shouldFailWithBadClientSideSerialization() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("java.awt.Color.RED");
-
- try {
- results.all().join();
- fail("Should have thrown exception over bad serialization");
- } catch (Exception ex) {
- final Throwable inner = ExceptionUtils.getRootCause(ex);
- assertTrue(inner instanceof RuntimeException);
- assertThat(inner.getMessage(), startsWith("Encountered unregistered class ID:"));
- }
-
- // should not die completely just because we had a bad serialization error. that kind of stuff happens
- // from time to time, especially in the console if you're just exploring.
- assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldFailWithScriptExecutionException() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("1/0");
-
- try {
- results.all().join();
- fail("Should have thrown exception over bad serialization");
- } catch (Exception ex) {
- final Throwable inner = ExceptionUtils.getRootCause(ex);
- assertTrue(inner instanceof ResponseException);
- assertThat(inner.getMessage(), endsWith("Division by zero"));
- }
-
- // should not die completely just because we had a bad serialization error. that kind of stuff happens
- // from time to time, especially in the console if you're just exploring.
- assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldProcessRequestsOutOfOrder() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet rsFive = client.submit("Thread.sleep(5000);'five'");
- final ResultSet rsZero = client.submit("'zero'");
-
- final CompletableFuture<List<Result>> futureFive = rsFive.all();
- final CompletableFuture<List<Result>> futureZero = rsZero.all();
-
- final long start = System.nanoTime();
- assertFalse(futureFive.isDone());
- assertEquals("zero", futureZero.get().get(0).getString());
-
- logger.info("Eval of 'zero' complete: " + TimeUtil.millisSince(start));
-
- assertFalse(futureFive.isDone());
- assertEquals("five", futureFive.get(10, TimeUnit.SECONDS).get(0).getString());
-
- logger.info("Eval of 'five' complete: " + TimeUtil.millisSince(start));
- }
-
- @Test
- public void shouldProcessSessionRequestsInOrder() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect(name.getMethodName());
-
- final ResultSet rsFive = client.submit("Thread.sleep(5000);'five'");
- final ResultSet rsZero = client.submit("'zero'");
-
- final CompletableFuture<List<Result>> futureFive = rsFive.all();
- final CompletableFuture<List<Result>> futureZero = rsZero.all();
-
- final AtomicBoolean hit = new AtomicBoolean(false);
- while (!futureFive.isDone()) {
- // futureZero can't finish before futureFive - racy business here?
- assertThat(futureZero.isDone(), is(false));
- hit.set(true);
- }
-
- // should have entered the loop at least once and thus proven that futureZero didn't return ahead of
- // futureFive
- assertThat(hit.get(), is(true));
-
- assertEquals("zero", futureZero.get().get(0).getString());
- assertEquals("five", futureFive.get(10, TimeUnit.SECONDS).get(0).getString());
- }
-
- @Test
- public void shouldWaitForAllResultsToArrive() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final AtomicInteger checked = new AtomicInteger(0);
- final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
- while (!results.allItemsAvailable()) {
- assertTrue(results.getAvailableItemCount() < 10);
- checked.incrementAndGet();
- Thread.sleep(100);
- }
-
- assertTrue(checked.get() > 0);
- assertEquals(9, results.getAvailableItemCount());
- cluster.close();
- }
-
- @Test
- public void shouldWorkOverNioTransport() throws Exception {
- final Cluster cluster = Cluster.build().channelizer(Channelizer.NioChannelizer.class.getName()).create();
- final Client client = cluster.connect();
-
- final AtomicInteger checked = new AtomicInteger(0);
- final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
- while (!results.allItemsAvailable()) {
- assertTrue(results.getAvailableItemCount() < 10);
- checked.incrementAndGet();
- Thread.sleep(100);
- }
-
- assertTrue(checked.get() > 0);
- assertEquals(9, results.getAvailableItemCount());
- cluster.close();
- }
-
- @Test
- public void shouldStream() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
- final AtomicInteger counter = new AtomicInteger(0);
- results.stream().map(i -> i.get(Integer.class) * 2).forEach(i -> assertEquals(counter.incrementAndGet() * 2, Integer.parseInt(i.toString())));
- assertEquals(9, counter.get());
- assertThat(results.allItemsAvailable(), is(true));
-
- // cant stream it again
- assertThat(results.stream().iterator().hasNext(), is(false));
-
- cluster.close();
- }
-
- @Test
- public void shouldIterate() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
- final Iterator<Result> itty = results.iterator();
- final AtomicInteger counter = new AtomicInteger(0);
- while (itty.hasNext()) {
- counter.incrementAndGet();
- assertEquals(counter.get(), itty.next().getInt());
- }
-
- assertEquals(9, counter.get());
- assertThat(results.allItemsAvailable(), is(true));
-
- // can't stream it again
- assertThat(results.iterator().hasNext(), is(false));
-
- cluster.close();
- }
-
- @Test
- public void shouldGetSomeThenSomeMore() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
- final CompletableFuture<List<Result>> batch1 = results.some(5);
- final CompletableFuture<List<Result>> batch2 = results.some(5);
- final CompletableFuture<List<Result>> batchNothingLeft = results.some(5);
-
- assertEquals(5, batch1.get().size());
- assertEquals(1, batch1.get().get(0).getInt());
- assertEquals(2, batch1.get().get(1).getInt());
- assertEquals(3, batch1.get().get(2).getInt());
- assertEquals(4, batch1.get().get(3).getInt());
- assertEquals(5, batch1.get().get(4).getInt());
-
- assertEquals(4, batch2.get().size());
- assertEquals(6, batch2.get().get(0).getInt());
- assertEquals(7, batch2.get().get(1).getInt());
- assertEquals(8, batch2.get().get(2).getInt());
- assertEquals(9, batch2.get().get(3).getInt());
-
- assertEquals(0, batchNothingLeft.get().size());
-
- cluster.close();
- }
-
- @Test
- public void shouldGetOneThenSomeThenSomeMore() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
- final Result one = results.one();
- final CompletableFuture<List<Result>> batch1 = results.some(4);
- final CompletableFuture<List<Result>> batch2 = results.some(5);
- final CompletableFuture<List<Result>> batchNothingLeft = results.some(5);
-
- assertEquals(1, one.getInt());
-
- assertEquals(4, batch1.get().size());
- assertEquals(2, batch1.get().get(0).getInt());
- assertEquals(3, batch1.get().get(1).getInt());
- assertEquals(4, batch1.get().get(2).getInt());
- assertEquals(5, batch1.get().get(3).getInt());
-
- assertEquals(4, batch2.get().size());
- assertEquals(6, batch2.get().get(0).getInt());
- assertEquals(7, batch2.get().get(1).getInt());
- assertEquals(8, batch2.get().get(2).getInt());
- assertEquals(9, batch2.get().get(3).getInt());
-
- assertEquals(0, batchNothingLeft.get().size());
-
- cluster.close();
- }
-
- @Test
- public void shouldAvoidDeadlockOnCallToResultSetDotAll() throws Exception {
-
- // This test arose from this issue: https://github.org/apache/tinkerpop/tinkerpop3/issues/515
- //
- // ResultSet.all returns a CompletableFuture that blocks on the worker pool until isExhausted returns false.
- // isExhausted in turn needs a thread on the worker pool to even return. So its totally possible to consume all
- // threads on the worker pool waiting for .all to finish such that you can't even get one to wait for
- // isExhausted to run.
- //
- // Note that all() doesn't work as described above anymore. It waits for callback on readComplete rather
- // than blocking on isExhausted.
- final int workerPoolSizeForDriver = 2;
-
- // the number of requests 4 times the size of the worker pool as this originally did produce the problem
- // described above in the javadoc of the test (though an equivalent number also produced it), but this has
- // been tested to much higher multiples and passes. note that the maxWaitForConnection setting is high so
- // that the client doesn't timeout waiting for an available connection. obviously this can also be fixed
- // by increasing the maxConnectionPoolSize.
- final int requests = workerPoolSizeForDriver * 4;
- final Cluster cluster = Cluster.build()
- .workerPoolSize(workerPoolSizeForDriver)
- .maxWaitForConnection(300000)
- .create();
- final Client client = cluster.connect();
-
- final CountDownLatch latch = new CountDownLatch(requests);
- final AtomicReference[] refs = new AtomicReference[requests];
- IntStream.range(0, requests).forEach(ix -> {
- refs[ix] = new AtomicReference();
- client.submitAsync("Thread.sleep(5000);[1,2,3,4,5,6,7,8,9]").thenAccept(rs ->
- rs.all().thenAccept(refs[ix]::set).thenRun(latch::countDown));
- });
-
- // countdown should have reached zero as results should have eventually been all returned and processed
- assertTrue(latch.await(20, TimeUnit.SECONDS));
-
- final List<Integer> expected = IntStream.range(1, 10).boxed().collect(Collectors.toList());
- IntStream.range(0, requests).forEach(r ->
- assertTrue(expected.containsAll(((List<Result>) refs[r].get()).stream().map(resultItem -> new Integer(resultItem.getInt())).collect(Collectors.toList()))));
- }
-
- @Test
- public void shouldCloseWithServerDown() throws Exception {
- final Cluster cluster = Cluster.open();
- cluster.connect().init();
-
- stopServer();
-
- cluster.close();
- }
-
- @Test
- public void shouldMarkHostDeadSinceServerIsDown() throws Exception {
- final Cluster cluster = Cluster.open();
- assertEquals(0, cluster.availableHosts().size());
- cluster.connect().init();
- assertEquals(1, cluster.availableHosts().size());
-
- stopServer();
-
- cluster.connect().init();
- assertEquals(0, cluster.availableHosts().size());
-
- cluster.close();
- }
-
- @Test
- public void shouldFailWithBadServerSideSerialization() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("TinkerGraph.open().variables()");
-
- try {
- results.all().join();
- fail();
- } catch (Exception ex) {
- final Throwable inner = ExceptionUtils.getRootCause(ex);
- assertTrue(inner instanceof ResponseException);
- assertEquals(ResponseStatusCode.SERVER_ERROR_SERIALIZATION, ((ResponseException) inner).getResponseStatusCode());
- }
-
- // should not die completely just because we had a bad serialization error. that kind of stuff happens
- // from time to time, especially in the console if you're just exploring.
- assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldSerializeToStringWhenRequested() throws Exception {
- final Map<String, Object> m = new HashMap<>();
- m.put("serializeResultToString", true);
- final GryoMessageSerializerV1d0 serializer = new GryoMessageSerializerV1d0();
- serializer.configure(m, null);
-
- final Cluster cluster = Cluster.build().serializer(serializer).create();
- final Client client = cluster.connect();
-
- final ResultSet resultSet = client.submit("TinkerFactory.createClassic()");
- final List<Result> results = resultSet.all().join();
- assertEquals(1, results.size());
- assertEquals("tinkergraph[vertices:6 edges:6]", results.get(0).getString());
-
- cluster.close();
- }
-
- @Test
- public void shouldDeserializeWithCustomClasses() throws Exception {
- final Map<String, Object> m = new HashMap<>();
- m.put("custom", Arrays.asList(String.format("%s;%s", JsonBuilder.class.getCanonicalName(), JsonBuilderGryoSerializer.class.getCanonicalName())));
- final GryoMessageSerializerV1d0 serializer = new GryoMessageSerializerV1d0();
- serializer.configure(m, null);
-
- final Cluster cluster = Cluster.build().serializer(serializer).create();
- final Client client = cluster.connect();
-
- final List<Result> json = client.submit("b = new JsonBuilder();b.people{person {fname 'stephen'\nlname 'mallette'}};b").all().join();
- assertEquals("{\"people\":{\"person\":{\"fname\":\"stephen\",\"lname\":\"mallette\"}}}", json.get(0).getString());
- cluster.close();
- }
-
- @Test
- public void shouldWorkWithGraphSONSerialization() throws Exception {
- final Cluster cluster = Cluster.build("localhost").serializer(Serializers.GRAPHSON_V1D0).create();
- final Client client = cluster.connect();
-
- final List<Result> r = client.submit("TinkerFactory.createModern().traversal().V(1)").all().join();
- assertEquals(1, r.size());
-
- final Map<String,Object> m = r.get(0).get(Map.class);
- assertEquals(4, m.size());
- assertEquals(1, m.get("id"));
- assertEquals("person", m.get("label"));
- assertEquals("vertex", m.get("type"));
-
- final Map<String,Object> properties = (Map<String,Object>) m.get("properties");
- assertEquals(2, properties.size());
-
- final List<Object> names = (List<Object>) properties.get("name");
- assertEquals(1, names.size());
-
- final Map<String,Object> nameProperties = (Map<String,Object>) names.get(0);
- assertEquals(2, nameProperties.size());
- assertEquals(0l, nameProperties.get("id"));
- assertEquals("marko", nameProperties.get("value"));
-
- final List<Object> ages = (List<Object>) properties.get("age");
- assertEquals(1, ages.size());
-
- final Map<String,Object> ageProperties = (Map<String,Object>) ages.get(0);
- assertEquals(2, ageProperties.size());
- assertEquals(1l, ageProperties.get("id"));
- assertEquals(29, ageProperties.get("value"));
-
- cluster.close();
- }
-
- @Test
- @org.junit.Ignore("Can't seem to make this test pass consistently")
- public void shouldHandleRequestSentThatNeverReturns() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- final ResultSet results = client.submit("Thread.sleep(10000); 'should-not-ever-get-back-coz-we-killed-the-server'");
-
- stopServer();
-
- // give the server a chance to kill everything
- Thread.sleep(1000);
-
- try {
- results.all().get(10000, TimeUnit.MILLISECONDS);
- fail("Server was stopped before the request could execute");
- } catch (TimeoutException toe) {
- fail("Should not have tossed a TimeOutException getting the result");
- } catch (Exception ex) {
- final Throwable cause = ExceptionUtils.getCause(ex);
- assertThat(cause.getMessage(), containsString("rejected from java.util.concurrent.ThreadPoolExecutor"));
- }
-
- cluster.close();
- }
-
- @Test
- public void shouldFailClientSideWithTooLargeAResponse() {
- final Cluster cluster = Cluster.build().maxContentLength(1).create();
- final Client client = cluster.connect();
-
- try {
- final String fatty = IntStream.range(0, 100).mapToObj(String::valueOf).collect(Collectors.joining());
- client.submit("'" + fatty + "'").all().get();
- fail("Should throw an exception.");
- } catch (Exception re) {
- final Throwable root = ExceptionUtils.getRootCause(re);
- assertTrue(root.getMessage().equals("Max frame length of 1 has been exceeded."));
- } finally {
- cluster.close();
- }
- }
-
- @Test
- public void shouldReturnNiceMessageFromOpSelector() {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect();
-
- try {
- final Map m = new HashMap<>();
- m.put(null, "a null key will force a throw of OpProcessorException in message validation");
- client.submit("1+1", m).all().get();
- fail("Should throw an exception.");
- } catch (Exception re) {
- final Throwable root = ExceptionUtils.getRootCause(re);
- assertEquals("The [eval] message is using one or more invalid binding keys - they must be of type String and cannot be null", root.getMessage());
- } finally {
- cluster.close();
- }
- }
-
- @Test
- public void shouldExecuteScriptInSession() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
-
- final ResultSet results1 = client.submit("x = [1,2,3,4,5,6,7,8,9]");
- assertEquals(9, results1.all().get().size());
-
- final ResultSet results2 = client.submit("x[0]+1");
- assertEquals(2, results2.all().get().get(0).getInt());
-
- final ResultSet results3 = client.submit("x[1]+2");
- assertEquals(4, results3.all().get().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldNotThrowNoSuchElementException() throws Exception {
- final Cluster cluster = Cluster.open();
- final Client client = cluster.connect();
-
- try {
- // this should return "nothing" - there should be no exception
- assertNull(client.submit("g.V().has('name','kadfjaldjfla')").one());
- } finally {
- cluster.close();
- }
- }
-
- @Test
- public void shouldCloseSession() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
-
- final ResultSet results1 = client.submit("x = [1,2,3,4,5,6,7,8,9]");
- assertEquals(9, results1.all().get().size());
- final ResultSet results2 = client.submit("x[0]+1");
- assertEquals(2, results2.all().get().get(0).getInt());
-
- client.close();
-
- try {
- client.submit("x[0]+1");
- fail("Should have thrown an exception because the connection is closed");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ConnectionException.class));
- }
- }
-
- @Test
- public void shouldExecuteScriptInSessionAssumingDefaultedImports() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
-
- final ResultSet results1 = client.submit("TinkerFactory.class.name");
- assertEquals(TinkerFactory.class.getName(), results1.all().get().get(0).getString());
-
- cluster.close();
- }
-
- @Test
- public void shouldExecuteScriptInSessionOnTransactionalGraph() throws Exception {
- assumeNeo4jIsPresent();
-
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
-
- final Vertex vertexBeforeTx = client.submit("v=graph.addVertex(\"name\",\"stephen\")").all().get().get(0).getVertex();
- assertEquals("stephen", vertexBeforeTx.values("name").next());
-
- final Vertex vertexFromV = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
- assertEquals("stephen", vertexFromV.values("name").next());
-
- final Vertex vertexFromBinding = client.submit("v").all().get().get(0).getVertex();
- assertEquals("stephen", vertexFromBinding.values("name").next());
-
- final Vertex vertexAfterTx = client.submit("v.property(\"color\",\"blue\"); graph.tx().commit(); v").all().get().get(0).getVertex();
- assertEquals("stephen", vertexAfterTx.values("name").next());
- assertEquals("blue", vertexAfterTx.values("color").next());
-
- cluster.close();
- }
-
- @Test
- public void shouldExecuteScriptInSessionOnTransactionalWithManualTransactionsGraph() throws Exception {
- assumeNeo4jIsPresent();
-
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
- final Client sessionlessClient = cluster.connect();
- client.submit("graph.tx().onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);null").all().get();
- client.submit("graph.tx().open()").all().get();
-
- final Vertex vertexBeforeTx = client.submit("v=graph.addVertex(\"name\",\"stephen\")").all().get().get(0).getVertex();
- assertEquals("stephen", vertexBeforeTx.values("name").next());
-
- final Vertex vertexFromV = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
- assertEquals("stephen", vertexFromV.values("name").next());
-
- final Vertex vertexFromBinding = client.submit("v").all().get().get(0).getVertex();
- assertEquals("stephen", vertexFromBinding.values("name").next());
-
- client.submit("v.property(\"color\",\"blue\")").all().get();
- client.submit("graph.tx().commit()").all().get();
-
- // Run a sessionless request to change transaction.readWriteConsumer back to AUTO
- // The will make the next in session request fail if consumers aren't ThreadLocal
- sessionlessClient.submit("graph.vertices().next()").all().get();
-
- client.submit("graph.tx().open()").all().get();
-
- final Vertex vertexAfterTx = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
- assertEquals("stephen", vertexAfterTx.values("name").next());
- assertEquals("blue", vertexAfterTx.values("color").next());
-
- client.submit("graph.tx().rollback()").all().get();
-
- cluster.close();
- }
-
- @Test
- public void shouldExecuteInSessionAndSessionlessWithoutOpeningTransaction() throws Exception {
- assumeNeo4jIsPresent();
-
- final Cluster cluster = Cluster.build().create();
- final Client sessionClient = cluster.connect(name.getMethodName());
- final Client sessionlessClient = cluster.connect();
-
- //open transaction in session, then add vertex and commit
- sessionClient.submit("graph.tx().open()").all().get();
- final Vertex vertexBeforeTx = sessionClient.submit("v=graph.addVertex(\"name\",\"stephen\")").all().get().get(0).getVertex();
- assertEquals("stephen", vertexBeforeTx.values("name").next());
- sessionClient.submit("graph.tx().commit()").all().get();
-
- // check that session transaction is closed
- final boolean isOpen = sessionClient.submit("graph.tx().isOpen()").all().get().get(0).getBoolean();
- assertTrue("Transaction should be closed", !isOpen);
-
- //run a sessionless read
- sessionlessClient.submit("graph.traversal().V()").all().get();
-
- // check that session transaction is still closed
- final boolean isOpenAfterSessionless = sessionClient.submit("graph.tx().isOpen()").all().get().get(0).getBoolean();
- assertTrue("Transaction should stil be closed", !isOpenAfterSessionless);
-
- }
-
- @Test
- public void shouldExecuteSessionlessScriptOnTransactionalGraph() throws Exception {
- assumeNeo4jIsPresent();
-
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect();
-
- // this line is important because it tests GraphTraversal which has a certain transactional path
- final Vertex vertexRequest1 = client.submit("g.addV(\"name\",\"stephen\")").all().get().get(0).getVertex();
- assertEquals("stephen", vertexRequest1.values("name").next());
-
- final Vertex vertexRequest2 = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
- assertEquals("stephen", vertexRequest2.values("name").next());
-
- // this line is important because it tests the other transactional path
- final Vertex vertexRequest3 = client.submit("graph.addVertex(\"name\",\"marko\")").all().get().get(0).getVertex();
- assertEquals("marko", vertexRequest3.values("name").next());
-
- assertEquals(2, client.submit("g.V().count()").all().get().get(0).getLong());
-
- cluster.close();
- }
-
- @Test
- public void shouldExecuteScriptInSessionWithBindingsSavedOnServerBetweenRequests() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
-
- final Map<String, Object> bindings1 = new HashMap<>();
- bindings1.put("a", 100);
- bindings1.put("b", 200);
- final ResultSet results1 = client.submit("x = a + b", bindings1);
- assertEquals(300, results1.one().getInt());
-
- final Map<String, Object> bindings2 = new HashMap<>();
- bindings2.put("b", 100);
- final ResultSet results2 = client.submit("x + b + a", bindings2);
- assertEquals(500, results2.one().getInt());
-
- final Map<String, Object> bindings3 = new HashMap<>();
- bindings3.put("x", 100);
- final ResultSet results3 = client.submit("x + b + a + 1", bindings3);
- assertEquals(301, results3.one().getInt());
-
- final Map<String, Object> bindings4 = new HashMap<>();
- final ResultSet results4 = client.submit("x + b + a + 1", bindings4);
- assertEquals(301, results4.one().getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldExecuteScriptsInMultipleSession() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client1 = cluster.connect(name.getMethodName() + "1");
- final Client client2 = cluster.connect(name.getMethodName() + "2");
- final Client client3 = cluster.connect(name.getMethodName() + "3");
-
- final ResultSet results11 = client1.submit("x = 1");
- final ResultSet results21 = client2.submit("x = 2");
- final ResultSet results31 = client3.submit("x = 3");
- assertEquals(1, results11.all().get().get(0).getInt());
- assertEquals(2, results21.all().get().get(0).getInt());
- assertEquals(3, results31.all().get().get(0).getInt());
-
- final ResultSet results12 = client1.submit("x + 100");
- final ResultSet results22 = client2.submit("x * 2");
- final ResultSet results32 = client3.submit("x * 10");
- assertEquals(101, results12.all().get().get(0).getInt());
- assertEquals(4, results22.all().get().get(0).getInt());
- assertEquals(30, results32.all().get().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldNotHaveKnowledgeOfBindingsBetweenRequestsWhenSessionless() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client1 = cluster.connect();
- final Client client2 = cluster.connect();
- final Client client3 = cluster.connect();
-
- final ResultSet results11 = client1.submit("x = 1");
- final ResultSet results21 = client2.submit("x = 2");
- final ResultSet results31 = client3.submit("x = 3");
- assertEquals(1, results11.all().get().get(0).getInt());
- assertEquals(2, results21.all().get().get(0).getInt());
- assertEquals(3, results31.all().get().get(0).getInt());
-
- try {
- client1.submit("x").all().get();
- fail("The variable 'x' should not be present on the new request.");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, IsInstanceOf.instanceOf(ResponseException.class));
- assertThat(root.getMessage(), containsString("No such property: x for class"));
- }
-
- try {
- client2.submit("x").all().get();
- fail("The variable 'x' should not be present on the new request.");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, IsInstanceOf.instanceOf(ResponseException.class));
- assertThat(root.getMessage(), containsString("No such property: x for class"));
- }
-
- try {
- client3.submit("x").all().get();
- fail("The variable 'x' should not be present on the new request.");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, IsInstanceOf.instanceOf(ResponseException.class));
- assertThat(root.getMessage(), containsString("No such property: x for class"));
- }
-
- cluster.close();
- }
+// @Test
+// public void shouldEventuallySucceedAfterChannelLevelError() throws Exception {
+// final Cluster cluster = Cluster.build().addContactPoint("localhost")
+// .reconnectIntialDelay(500)
+// .reconnectInterval(500)
+// .maxContentLength(1024).create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit("def x = '';(0..<1024).each{x = x + '$it'};x").all().get();
+// fail("Request should have failed because it exceeded the max content length allowed");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root.getMessage(), containsString("Max frame length of 1024 has been exceeded."));
+// }
+//
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldEventuallySucceedAfterMuchFailure() throws Exception {
+// final Cluster cluster = Cluster.build().addContactPoint("localhost").create();
+// final Client client = cluster.connect();
+//
+// // tested independently to 10000 iterations but for speed, bumped back to 1000
+// IntStream.range(0,1000).forEach(i -> {
+// try {
+// client.submit("1 + 9 9").all().join().get(0).getInt();
+// fail("Should not have gone through due to syntax error");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, instanceOf(ResponseException.class));
+// }
+// });
+//
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldEventuallySucceedOnSameServer() throws Exception {
+// stopServer();
+//
+// final Cluster cluster = Cluster.build().addContactPoint("localhost").create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit("1+1").all().join().get(0).getInt();
+// fail("Should not have gone through because the server is not running");
+// } catch (Exception i) {
+// final Throwable root = ExceptionUtils.getRootCause(i);
+// assertThat(root, instanceOf(TimeoutException.class));
+// }
+//
+// startServer();
+//
+// // default reconnect time is 1 second so wait some extra time to be sure it has time to try to bring it
+// // back to life
+// TimeUnit.SECONDS.sleep(3);
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldEventuallySucceedWithRoundRobin() throws Exception {
+// final String noGremlinServer = "74.125.225.19";
+// final Cluster cluster = Cluster.build(noGremlinServer).addContactPoint("localhost").create();
+// final Client client = cluster.connect();
+//
+// // the first host is dead on init. request should succeed on localhost
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldHandleResultsOfAllSizes() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final String script = "g.V().drop().iterate();\n" +
+// "\n" +
+// "List ids = new ArrayList();\n" +
+// "\n" +
+// "int ii = 0;\n" +
+// "Vertex v = graph.addVertex();\n" +
+// "v.property(\"ii\", ii);\n" +
+// "v.property(\"sin\", Math.sin(ii));\n" +
+// "ids.add(v.id());\n" +
+// "\n" +
+// "Random rand = new Random();\n" +
+// "for (; ii < size; ii++) {\n" +
+// " v = graph.addVertex();\n" +
+// " v.property(\"ii\", ii);\n" +
+// " v.property(\"sin\", Math.sin(ii/5.0));\n" +
+// " Vertex u = g.V(ids.get(rand.nextInt(ids.size()))).next();\n" +
+// " v.addEdge(\"linked\", u);\n" +
+// " ids.add(u.id());\n" +
+// " ids.add(v.id());\n" +
+// "}\n" +
+// "g.V()";
+//
+// final List<Integer> sizes = Arrays.asList(1, 10, 20, 50, 75, 100, 250, 500, 750, 1000, 5000, 10000);
+// for (Integer size : sizes) {
+// final Map<String, Object> params = new HashMap<>();
+// params.put("size", size - 1);
+// final ResultSet results = client.submit(script, params);
+//
+// assertEquals(size.intValue(), results.all().get().size());
+// }
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldFailWithBadClientSideSerialization() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("java.awt.Color.RED");
+//
+// try {
+// results.all().join();
+// fail("Should have thrown exception over bad serialization");
+// } catch (Exception ex) {
+// final Throwable inner = ExceptionUtils.getRootCause(ex);
+// assertTrue(inner instanceof RuntimeException);
+// assertThat(inner.getMessage(), startsWith("Encountered unregistered class ID:"));
+// }
+//
+// // should not die completely just because we had a bad serialization error. that kind of stuff happens
+// // from time to time, especially in the console if you're just exploring.
+// assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldFailWithScriptExecutionException() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("1/0");
+//
+// try {
+// results.all().join();
+// fail("Should have thrown exception over bad serialization");
+// } catch (Exception ex) {
+// final Throwable inner = ExceptionUtils.getRootCause(ex);
+// assertTrue(inner instanceof ResponseException);
+// assertThat(inner.getMessage(), endsWith("Division by zero"));
+// }
+//
+// // should not die completely just because we had a bad serialization error. that kind of stuff happens
+// // from time to time, especially in the console if you're just exploring.
+// assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldProcessRequestsOutOfOrder() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet rsFive = client.submit("Thread.sleep(5000);'five'");
+// final ResultSet rsZero = client.submit("'zero'");
+//
+// final CompletableFuture<List<Result>> futureFive = rsFive.all();
+// final CompletableFuture<List<Result>> futureZero = rsZero.all();
+//
+// final long start = System.nanoTime();
+// assertFalse(futureFive.isDone());
+// assertEquals("zero", futureZero.get().get(0).getString());
+//
+// logger.info("Eval of 'zero' complete: " + TimeUtil.millisSince(start));
+//
+// assertFalse(futureFive.isDone());
+// assertEquals("five", futureFive.get(10, TimeUnit.SECONDS).get(0).getString());
+//
+// logger.info("Eval of 'five' complete: " + TimeUtil.millisSince(start));
+// }
+//
+// @Test
+// public void shouldProcessSessionRequestsInOrder() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// final ResultSet rsFive = client.submit("Thread.sleep(5000);'five'");
+// final ResultSet rsZero = client.submit("'zero'");
+//
+// final CompletableFuture<List<Result>> futureFive = rsFive.all();
+// final CompletableFuture<List<Result>> futureZero = rsZero.all();
+//
+// final AtomicBoolean hit = new AtomicBoolean(false);
+// while (!futureFive.isDone()) {
+// // futureZero can't finish before futureFive - racy business here?
+// assertThat(futureZero.isDone(), is(false));
+// hit.set(true);
+// }
+//
+// // should have entered the loop at least once and thus proven that futureZero didn't return ahead of
+// // futureFive
+// assertThat(hit.get(), is(true));
+//
+// assertEquals("zero", futureZero.get().get(0).getString());
+// assertEquals("five", futureFive.get(10, TimeUnit.SECONDS).get(0).getString());
+// }
+//
+// @Test
+// public void shouldWaitForAllResultsToArrive() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final AtomicInteger checked = new AtomicInteger(0);
+// final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
+// while (!results.allItemsAvailable()) {
+// assertTrue(results.getAvailableItemCount() < 10);
+// checked.incrementAndGet();
+// Thread.sleep(100);
+// }
+//
+// assertTrue(checked.get() > 0);
+// assertEquals(9, results.getAvailableItemCount());
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldWorkOverNioTransport() throws Exception {
+// final Cluster cluster = Cluster.build().channelizer(Channelizer.NioChannelizer.class.getName()).create();
+// final Client client = cluster.connect();
+//
+// final AtomicInteger checked = new AtomicInteger(0);
+// final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
+// while (!results.allItemsAvailable()) {
+// assertTrue(results.getAvailableItemCount() < 10);
+// checked.incrementAndGet();
+// Thread.sleep(100);
+// }
+//
+// assertTrue(checked.get() > 0);
+// assertEquals(9, results.getAvailableItemCount());
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldStream() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
+// final AtomicInteger counter = new AtomicInteger(0);
+// results.stream().map(i -> i.get(Integer.class) * 2).forEach(i -> assertEquals(counter.incrementAndGet() * 2, Integer.parseInt(i.toString())));
+// assertEquals(9, counter.get());
+// assertThat(results.allItemsAvailable(), is(true));
+//
+// // cant stream it again
+// assertThat(results.stream().iterator().hasNext(), is(false));
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldIterate() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
+// final Iterator<Result> itty = results.iterator();
+// final AtomicInteger counter = new AtomicInteger(0);
+// while (itty.hasNext()) {
+// counter.incrementAndGet();
+// assertEquals(counter.get(), itty.next().getInt());
+// }
+//
+// assertEquals(9, counter.get());
+// assertThat(results.allItemsAvailable(), is(true));
+//
+// // can't stream it again
+// assertThat(results.iterator().hasNext(), is(false));
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldGetSomeThenSomeMore() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
+// final CompletableFuture<List<Result>> batch1 = results.some(5);
+// final CompletableFuture<List<Result>> batch2 = results.some(5);
+// final CompletableFuture<List<Result>> batchNothingLeft = results.some(5);
+//
+// assertEquals(5, batch1.get().size());
+// assertEquals(1, batch1.get().get(0).getInt());
+// assertEquals(2, batch1.get().get(1).getInt());
+// assertEquals(3, batch1.get().get(2).getInt());
+// assertEquals(4, batch1.get().get(3).getInt());
+// assertEquals(5, batch1.get().get(4).getInt());
+//
+// assertEquals(4, batch2.get().size());
+// assertEquals(6, batch2.get().get(0).getInt());
+// assertEquals(7, batch2.get().get(1).getInt());
+// assertEquals(8, batch2.get().get(2).getInt());
+// assertEquals(9, batch2.get().get(3).getInt());
+//
+// assertEquals(0, batchNothingLeft.get().size());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldGetOneThenSomeThenSomeMore() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("[1,2,3,4,5,6,7,8,9]");
+// final Result one = results.one();
+// final CompletableFuture<List<Result>> batch1 = results.some(4);
+// final CompletableFuture<List<Result>> batch2 = results.some(5);
+// final CompletableFuture<List<Result>> batchNothingLeft = results.some(5);
+//
+// assertEquals(1, one.getInt());
+//
+// assertEquals(4, batch1.get().size());
+// assertEquals(2, batch1.get().get(0).getInt());
+// assertEquals(3, batch1.get().get(1).getInt());
+// assertEquals(4, batch1.get().get(2).getInt());
+// assertEquals(5, batch1.get().get(3).getInt());
+//
+// assertEquals(4, batch2.get().size());
+// assertEquals(6, batch2.get().get(0).getInt());
+// assertEquals(7, batch2.get().get(1).getInt());
+// assertEquals(8, batch2.get().get(2).getInt());
+// assertEquals(9, batch2.get().get(3).getInt());
+//
+// assertEquals(0, batchNothingLeft.get().size());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldAvoidDeadlockOnCallToResultSetDotAll() throws Exception {
+//
+// // This test arose from this issue: https://github.org/apache/tinkerpop/tinkerpop3/issues/515
+// //
+// // ResultSet.all returns a CompletableFuture that blocks on the worker pool until isExhausted returns false.
+// // isExhausted in turn needs a thread on the worker pool to even return. So its totally possible to consume all
+// // threads on the worker pool waiting for .all to finish such that you can't even get one to wait for
+// // isExhausted to run.
+// //
+// // Note that all() doesn't work as described above anymore. It waits for callback on readComplete rather
+// // than blocking on isExhausted.
+// final int workerPoolSizeForDriver = 2;
+//
+// // the number of requests 4 times the size of the worker pool as this originally did produce the problem
+// // described above in the javadoc of the test (though an equivalent number also produced it), but this has
+// // been tested to much higher multiples and passes. note that the maxWaitForConnection setting is high so
+// // that the client doesn't timeout waiting for an available connection. obviously this can also be fixed
+// // by increasing the maxConnectionPoolSize.
+// final int requests = workerPoolSizeForDriver * 4;
+// final Cluster cluster = Cluster.build()
+// .workerPoolSize(workerPoolSizeForDriver)
+// .maxWaitForConnection(300000)
+// .create();
+// final Client client = cluster.connect();
+//
+// final CountDownLatch latch = new CountDownLatch(requests);
+// final AtomicReference[] refs = new AtomicReference[requests];
+// IntStream.range(0, requests).forEach(ix -> {
+// refs[ix] = new AtomicReference();
+// client.submitAsync("Thread.sleep(5000);[1,2,3,4,5,6,7,8,9]").thenAccept(rs ->
+// rs.all().thenAccept(refs[ix]::set).thenRun(latch::countDown));
+// });
+//
+// // countdown should have reached zero as results should have eventually been all returned and processed
+// assertTrue(latch.await(20, TimeUnit.SECONDS));
+//
+// final List<Integer> expected = IntStream.range(1, 10).boxed().collect(Collectors.toList());
+// IntStream.range(0, requests).forEach(r ->
+// assertTrue(expected.containsAll(((List<Result>) refs[r].get()).stream().map(resultItem -> new Integer(resultItem.getInt())).collect(Collectors.toList()))));
+// }
+//
+// @Test
+// public void shouldCloseWithServerDown() throws Exception {
+// final Cluster cluster = Cluster.open();
+// cluster.connect().init();
+//
+// stopServer();
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldMarkHostDeadSinceServerIsDown() throws Exception {
+// final Cluster cluster = Cluster.open();
+// assertEquals(0, cluster.availableHosts().size());
+// cluster.connect().init();
+// assertEquals(1, cluster.availableHosts().size());
+//
+// stopServer();
+//
+// cluster.connect().init();
+// assertEquals(0, cluster.availableHosts().size());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldFailWithBadServerSideSerialization() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("TinkerGraph.open().variables()");
+//
+// try {
+// results.all().join();
+// fail();
+// } catch (Exception ex) {
+// final Throwable inner = ExceptionUtils.getRootCause(ex);
+// assertTrue(inner instanceof ResponseException);
+// assertEquals(ResponseStatusCode.SERVER_ERROR_SERIALIZATION, ((ResponseException) inner).getResponseStatusCode());
+// }
+//
+// // should not die completely just because we had a bad serialization error. that kind of stuff happens
+// // from time to time, especially in the console if you're just exploring.
+// assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldSerializeToStringWhenRequested() throws Exception {
+// final Map<String, Object> m = new HashMap<>();
+// m.put("serializeResultToString", true);
+// final GryoMessageSerializerV1d0 serializer = new GryoMessageSerializerV1d0();
+// serializer.configure(m, null);
+//
+// final Cluster cluster = Cluster.build().serializer(serializer).create();
+// final Client client = cluster.connect();
+//
+// final ResultSet resultSet = client.submit("TinkerFactory.createClassic()");
+// final List<Result> results = resultSet.all().join();
+// assertEquals(1, results.size());
+// assertEquals("tinkergraph[vertices:6 edges:6]", results.get(0).getString());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldDeserializeWithCustomClasses() throws Exception {
+// final Map<String, Object> m = new HashMap<>();
+// m.put("custom", Arrays.asList(String.format("%s;%s", JsonBuilder.class.getCanonicalName(), JsonBuilderGryoSerializer.class.getCanonicalName())));
+// final GryoMessageSerializerV1d0 serializer = new GryoMessageSerializerV1d0();
+// serializer.configure(m, null);
+//
+// final Cluster cluster = Cluster.build().serializer(serializer).create();
+// final Client client = cluster.connect();
+//
+// final List<Result> json = client.submit("b = new JsonBuilder();b.people{person {fname 'stephen'\nlname 'mallette'}};b").all().join();
+// assertEquals("{\"people\":{\"person\":{\"fname\":\"stephen\",\"lname\":\"mallette\"}}}", json.get(0).getString());
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldWorkWithGraphSONSerialization() throws Exception {
+// final Cluster cluster = Cluster.build("localhost").serializer(Serializers.GRAPHSON_V1D0).create();
+// final Client client = cluster.connect();
+//
+// final List<Result> r = client.submit("TinkerFactory.createModern().traversal().V(1)").all().join();
+// assertEquals(1, r.size());
+//
+// final Map<String,Object> m = r.get(0).get(Map.class);
+// assertEquals(4, m.size());
+// assertEquals(1, m.get("id"));
+// assertEquals("person", m.get("label"));
+// assertEquals("vertex", m.get("type"));
+//
+// final Map<String,Object> properties = (Map<String,Object>) m.get("properties");
+// assertEquals(2, properties.size());
+//
+// final List<Object> names = (List<Object>) properties.get("name");
+// assertEquals(1, names.size());
+//
+// final Map<String,Object> nameProperties = (Map<String,Object>) names.get(0);
+// assertEquals(2, nameProperties.size());
+// assertEquals(0l, nameProperties.get("id"));
+// assertEquals("marko", nameProperties.get("value"));
+//
+// final List<Object> ages = (List<Object>) properties.get("age");
+// assertEquals(1, ages.size());
+//
+// final Map<String,Object> ageProperties = (Map<String,Object>) ages.get(0);
+// assertEquals(2, ageProperties.size());
+// assertEquals(1l, ageProperties.get("id"));
+// assertEquals(29, ageProperties.get("value"));
+//
+// cluster.close();
+// }
+//
+// @Test
+// @org.junit.Ignore("Can't seem to make this test pass consistently")
+// public void shouldHandleRequestSentThatNeverReturns() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// final ResultSet results = client.submit("Thread.sleep(10000); 'should-not-ever-get-back-coz-we-killed-the-server'");
+//
+// stopServer();
+//
+// // give the server a chance to kill everything
+// Thread.sleep(1000);
+//
+// try {
+// results.all().get(10000, TimeUnit.MILLISECONDS);
+// fail("Server was stopped before the request could execute");
+// } catch (TimeoutException toe) {
+// fail("Should not have tossed a TimeOutException getting the result");
+// } catch (Exception ex) {
+// final Throwable cause = ExceptionUtils.getCause(ex);
+// assertThat(cause.getMessage(), containsString("rejected from java.util.concurrent.ThreadPoolExecutor"));
+// }
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldFailClientSideWithTooLargeAResponse() {
+// final Cluster cluster = Cluster.build().maxContentLength(1).create();
+// final Client client = cluster.connect();
+//
+// try {
+// final String fatty = IntStream.range(0, 100).mapToObj(String::valueOf).collect(Collectors.joining());
+// client.submit("'" + fatty + "'").all().get();
+// fail("Should throw an exception.");
+// } catch (Exception re) {
+// final Throwable root = ExceptionUtils.getRootCause(re);
+// assertTrue(root.getMessage().equals("Max frame length of 1 has been exceeded."));
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @Test
+// public void shouldReturnNiceMessageFromOpSelector() {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect();
+//
+// try {
+// final Map m = new HashMap<>();
+// m.put(null, "a null key will force a throw of OpProcessorException in message validation");
+// client.submit("1+1", m).all().get();
+// fail("Should throw an exception.");
+// } catch (Exception re) {
+// final Throwable root = ExceptionUtils.getRootCause(re);
+// assertEquals("The [eval] message is using one or more invalid binding keys - they must be of type String and cannot be null", root.getMessage());
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @Test
+// public void shouldExecuteScriptInSession() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// final ResultSet results1 = client.submit("x = [1,2,3,4,5,6,7,8,9]");
+// assertEquals(9, results1.all().get().size());
+//
+// final ResultSet results2 = client.submit("x[0]+1");
+// assertEquals(2, results2.all().get().get(0).getInt());
+//
+// final ResultSet results3 = client.submit("x[1]+2");
+// assertEquals(4, results3.all().get().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldNotThrowNoSuchElementException() throws Exception {
+// final Cluster cluster = Cluster.open();
+// final Client client = cluster.connect();
+//
+// try {
+// // this should return "nothing" - there should be no exception
+// assertNull(client.submit("g.V().has('name','kadfjaldjfla')").one());
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @Test
+// public void shouldCloseSession() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// final ResultSet results1 = client.submit("x = [1,2,3,4,5,6,7,8,9]");
+// assertEquals(9, results1.all().get().size());
+// final ResultSet results2 = client.submit("x[0]+1");
+// assertEquals(2, results2.all().get().get(0).getInt());
+//
+// client.close();
+//
+// try {
+// client.submit("x[0]+1");
+// fail("Should have thrown an exception because the connection is closed");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, instanceOf(ConnectionException.class));
+// }
+// }
+//
+// @Test
+// public void shouldExecuteScriptInSessionAssumingDefaultedImports() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// final ResultSet results1 = client.submit("TinkerFactory.class.name");
+// assertEquals(TinkerFactory.class.getName(), results1.all().get().get(0).getString());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldExecuteScriptInSessionOnTransactionalGraph() throws Exception {
+// assumeNeo4jIsPresent();
+//
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// final Vertex vertexBeforeTx = client.submit("v=graph.addVertex(\"name\",\"stephen\")").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexBeforeTx.values("name").next());
+//
+// final Vertex vertexFromV = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexFromV.values("name").next());
+//
+// final Vertex vertexFromBinding = client.submit("v").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexFromBinding.values("name").next());
+//
+// final Vertex vertexAfterTx = client.submit("v.property(\"color\",\"blue\"); graph.tx().commit(); v").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexAfterTx.values("name").next());
+// assertEquals("blue", vertexAfterTx.values("color").next());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldExecuteScriptInSessionOnTransactionalWithManualTransactionsGraph() throws Exception {
+// assumeNeo4jIsPresent();
+//
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect(name.getMethodName());
+// final Client sessionlessClient = cluster.connect();
+// client.submit("graph.tx().onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);null").all().get();
+// client.submit("graph.tx().open()").all().get();
+//
+// final Vertex vertexBeforeTx = client.submit("v=graph.addVertex(\"name\",\"stephen\")").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexBeforeTx.values("name").next());
+//
+// final Vertex vertexFromV = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexFromV.values("name").next());
+//
+// final Vertex vertexFromBinding = client.submit("v").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexFromBinding.values("name").next());
+//
+// client.submit("v.property(\"color\",\"blue\")").all().get();
+// client.submit("graph.tx().commit()").all().get();
+//
+// // Run a sessionless request to change transaction.readWriteConsumer back to AUTO
+// // The will make the next in session request fail if consumers aren't ThreadLocal
+// sessionlessClient.submit("graph.vertices().next()").all().get();
+//
+// client.submit("graph.tx().open()").all().get();
+//
+// final Vertex vertexAfterTx = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexAfterTx.values("name").next());
+// assertEquals("blue", vertexAfterTx.values("color").next());
+//
+// client.submit("graph.tx().rollback()").all().get();
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldExecuteInSessionAndSessionlessWithoutOpeningTransaction() throws Exception {
+// assumeNeo4jIsPresent();
+//
+// final Cluster cluster = Cluster.build().create();
+// final Client sessionClient = cluster.connect(name.getMethodName());
+// final Client sessionlessClient = cluster.connect();
+//
+// //open transaction in session, then add vertex and commit
+// sessionClient.submit("graph.tx().open()").all().get();
+// final Vertex vertexBeforeTx = sessionClient.submit("v=graph.addVertex(\"name\",\"stephen\")").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexBeforeTx.values("name").next());
+// sessionClient.submit("graph.tx().commit()").all().get();
+//
+// // check that session transaction is closed
+// final boolean isOpen = sessionClient.submit("graph.tx().isOpen()").all().get().get(0).getBoolean();
+// assertTrue("Transaction should be closed", !isOpen);
+//
+// //run a sessionless read
+// sessionlessClient.submit("graph.traversal().V()").all().get();
+//
+// // check that session transaction is still closed
+// final boolean isOpenAfterSessionless = sessionClient.submit("graph.tx().isOpen()").all().get().get(0).getBoolean();
+// assertTrue("Transaction should stil be closed", !isOpenAfterSessionless);
+//
+// }
+//
+// @Test
+// public void shouldExecuteSessionlessScriptOnTransactionalGraph() throws Exception {
+// assumeNeo4jIsPresent();
+//
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect();
+//
+// // this line is important because it tests GraphTraversal which has a certain transactional path
+// final Vertex vertexRequest1 = client.submit("g.addV(\"name\",\"stephen\")").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexRequest1.values("name").next());
+//
+// final Vertex vertexRequest2 = client.submit("graph.vertices().next()").all().get().get(0).getVertex();
+// assertEquals("stephen", vertexRequest2.values("name").next());
+//
+// // this line is important because it tests the other transactional path
+// final Vertex vertexRequest3 = client.submit("graph.addVertex(\"name\",\"marko\")").all().get().get(0).getVertex();
+// assertEquals("marko", vertexRequest3.values("name").next());
+//
+// assertEquals(2, client.submit("g.V().count()").all().get().get(0).getLong());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldExecuteScriptInSessionWithBindingsSavedOnServerBetweenRequests() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// final Map<String, Object> bindings1 = new HashMap<>();
+// bindings1.put("a", 100);
+// bindings1.put("b", 200);
+// final ResultSet results1 = client.submit("x = a + b", bindings1);
+// assertEquals(300, results1.one().getInt());
+//
+// final Map<String, Object> bindings2 = new HashMap<>();
+// bindings2.put("b", 100);
+// final ResultSet results2 = client.submit("x + b + a", bindings2);
+// assertEquals(500, results2.one().getInt());
+//
+// final Map<String, Object> bindings3 = new HashMap<>();
+// bindings3.put("x", 100);
+// final ResultSet results3 = client.submit("x + b + a + 1", bindings3);
+// assertEquals(301, results3.one().getInt());
+//
+// final Map<String, Object> bindings4 = new HashMap<>();
+// final ResultSet results4 = client.submit("x + b + a + 1", bindings4);
+// assertEquals(301, results4.one().getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldExecuteScriptsInMultipleSession() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client1 = cluster.connect(name.getMethodName() + "1");
+// final Client client2 = cluster.connect(name.getMethodName() + "2");
+// final Client client3 = cluster.connect(name.getMethodName() + "3");
+//
+// final ResultSet results11 = client1.submit("x = 1");
+// final ResultSet results21 = client2.submit("x = 2");
+// final ResultSet results31 = client3.submit("x = 3");
+// assertEquals(1, results11.all().get().get(0).getInt());
+// assertEquals(2, results21.all().get().get(0).getInt());
+// assertEquals(3, results31.all().get().get(0).getInt());
+//
+// final ResultSet results12 = client1.submit("x + 100");
+// final ResultSet results22 = client2.submit("x * 2");
+// final ResultSet results32 = client3.submit("x * 10");
+// assertEquals(101, results12.all().get().get(0).getInt());
+// assertEquals(4, results22.all().get().get(0).getInt());
+// assertEquals(30, results32.all().get().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldNotHaveKnowledgeOfBindingsBetweenRequestsWhenSessionless() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client1 = cluster.connect();
+// final Client client2 = cluster.connect();
+// final Client client3 = cluster.connect();
+//
+// final ResultSet results11 = client1.submit("x = 1");
+// final ResultSet results21 = client2.submit("x = 2");
+// final ResultSet results31 = client3.submit("x = 3");
+// assertEquals(1, results11.all().get().get(0).getInt());
+// assertEquals(2, results21.all().get().get(0).getInt());
+// assertEquals(3, results31.all().get().get(0).getInt());
+//
+// try {
+// client1.submit("x").all().get();
+// fail("The variable 'x' should not be present on the new request.");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, IsInstanceOf.instanceOf(ResponseException.class));
+// assertThat(root.getMessage(), containsString("No such property: x for class"));
+// }
+//
+// try {
+// client2.submit("x").all().get();
+// fail("The variable 'x' should not be present on the new request.");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, IsInstanceOf.instanceOf(ResponseException.class));
+// assertThat(root.getMessage(), containsString("No such property: x for class"));
+// }
+//
+// try {
+// client3.submit("x").all().get();
+// fail("The variable 'x' should not be present on the new request.");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, IsInstanceOf.instanceOf(ResponseException.class));
+// assertThat(root.getMessage(), containsString("No such property: x for class"));
+// }
+//
+// cluster.close();
+// }
@Test
public void shouldBeThreadSafeToUseOneClient() throws Exception {
@@ -995,202 +995,202 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
}
}
- @Test
- public void shouldRequireAliasedGraphVariablesInStrictTransactionMode() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect();
-
- try {
- client.submit("1+1").all().get();
- fail("Should have tossed an exception because strict mode is on and no aliasing was performed");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ResponseException.class));
- final ResponseException re = (ResponseException) root;
- assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode());
- }
-
- cluster.close();
- }
-
- @Test
- public void shouldAliasGraphVariablesInStrictTransactionMode() throws Exception {
- assumeNeo4jIsPresent();
-
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect();
-
- try {
- client.submit("g.addVertex('name','stephen');").all().get().get(0).getVertex();
- fail("Should have tossed an exception because \"g\" does not have the addVertex method under default config");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ResponseException.class));
- final ResponseException re = (ResponseException) root;
- assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode());
- }
-
- // keep the testing here until "rebind" is completely removed
- final Client reboundLegacy = cluster.connect().rebind("graph");
- final Vertex vLegacy = reboundLegacy.submit("g.addVertex('name','stephen')").all().get().get(0).getVertex();
- assertEquals("stephen", vLegacy.value("name"));
-
- final Client rebound = cluster.connect().alias("graph");
- final Vertex v = rebound.submit("g.addVertex('name','jason')").all().get().get(0).getVertex();
- assertEquals("jason", v.value("name"));
-
- cluster.close();
- }
-
- @Test
- public void shouldAliasGraphVariables() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect();
-
- try {
- client.submit("g.addVertex('name','stephen');").all().get().get(0).getVertex();
- fail("Should have tossed an exception because \"g\" does not have the addVertex method under default config");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ResponseException.class));
- final ResponseException re = (ResponseException) root;
- assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, re.getResponseStatusCode());
- }
-
- // keep the testing here until "rebind" is completely removed
- final Client reboundLegacy = cluster.connect().rebind("graph");
- final Vertex vLegacy = reboundLegacy.submit("g.addVertex('name','stephen')").all().get().get(0).getVertex();
- assertEquals("stephen", vLegacy.value("name"));
-
- final Client rebound = cluster.connect().alias("graph");
- final Vertex v = rebound.submit("g.addVertex('name','jason')").all().get().get(0).getVertex();
- assertEquals("jason", v.value("name"));
-
- cluster.close();
- }
-
- @Test
- public void shouldAliasTraversalSourceVariables() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect();
-
- try {
- client.submit("g.addV('name','stephen')").all().get().get(0).getVertex();
- fail("Should have tossed an exception because \"g\" is readonly in this context");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ResponseException.class));
- final ResponseException re = (ResponseException) root;
- assertEquals(ResponseStatusCode.SERVER_ERROR, re.getResponseStatusCode());
- }
-
- // keep the testing here until "rebind" is completely removed
- final Client clientLegacy = client.rebind("g1");
- final Vertex vLegacy = clientLegacy.submit("g.addV('name','stephen')").all().get().get(0).getVertex();
- assertEquals("stephen", vLegacy.value("name"));
-
- final Client clientAliased = client.alias("g1");
- final Vertex v = clientAliased.submit("g.addV('name','jason')").all().get().get(0).getVertex();
- assertEquals("jason", v.value("name"));
-
- cluster.close();
- }
-
- @Test
- public void shouldAliasGraphVariablesInSession() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
-
- try {
- client.submit("g.addVertex('name','stephen');").all().get().get(0).getVertex();
- fail("Should have tossed an exception because \"g\" does not have the addVertex method under default config");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ResponseException.class));
- final ResponseException re = (ResponseException) root;
- assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, re.getResponseStatusCode());
- }
-
- // keep the testing here until "rebind" is completely removed
- final Client reboundLegacy = client.rebind("graph");
- assertEquals("stephen", reboundLegacy.submit("n='stephen'").all().get().get(0).getString());
- final Vertex vLegacy = reboundLegacy.submit("g.addVertex('name',n)").all().get().get(0).getVertex();
- assertEquals("stephen", vLegacy.value("name"));
-
- final Client aliased = client.alias("graph");
- assertEquals("jason", reboundLegacy.submit("n='jason'").all().get().get(0).getString());
- final Vertex v = aliased.submit("g.addVertex('name',n)").all().get().get(0).getVertex();
- assertEquals("jason", v.value("name"));
-
- cluster.close();
- }
-
- @Test
- public void shouldAliasTraversalSourceVariablesInSession() throws Exception {
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect(name.getMethodName());
-
- try {
- client.submit("g.addV('name','stephen')").all().get().get(0).getVertex();
- fail("Should have tossed an exception because \"g\" is readonly in this context");
- } catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root, instanceOf(ResponseException.class));
- final ResponseException re = (ResponseException) root;
- assertEquals(ResponseStatusCode.SERVER_ERROR, re.getResponseStatusCode());
- }
-
- // keep the testing here until "rebind" is completely removed
- final Client clientLegacy = client.rebind("g1");
- assertEquals("stephen", clientLegacy.submit("n='stephen'").all().get().get(0).getString());
- final Vertex vLegacy = clientLegacy.submit("g.addV('name',n)").all().get().get(0).getVertex();
- assertEquals("stephen", vLegacy.value("name"));
-
- final Client clientAliased = client.alias("g1");
- assertEquals("jason", clientAliased.submit("n='jason'").all().get().get(0).getString());
- final Vertex v = clientAliased.submit("g.addV('name',n)").all().get().get(0).getVertex();
- assertEquals("jason", v.value("name"));
-
- cluster.close();
- }
-
- @Test
- public void shouldManageTransactionsInSession() throws Exception {
- assumeNeo4jIsPresent();
-
- final Cluster cluster = Cluster.build().create();
- final Client client = cluster.connect();
- final Client sessionWithManagedTx = cluster.connect(name.getMethodName() + "-managed", true);
- final Client sessionWithoutManagedTx = cluster.connect(name.getMethodName() + "-not-managed");
-
- // this should auto-commit
- final Vertex vStephen = sessionWithManagedTx.submit("v = g.addV('name','stephen').next()").all().get().get(0).getVertex();
- assertEquals("stephen", vStephen.value("name"));
-
- // the other clients should see that change because of auto-commit
- assertThat(client.submit("g.V().has('name','stephen').hasNext()").all().get().get(0).getBoolean(), is(true));
- assertThat(sessionWithoutManagedTx.submit("g.V().has('name','stephen').hasNext()").all().get().get(0).getBoolean(), is(true));
-
- // this should NOT auto-commit
- final Vertex vDaniel = sessionWithoutManagedTx.submit("v = g.addV('name','daniel').next()").all().get().get(0).getVertex();
- assertEquals("daniel", vDaniel.value("name"));
-
- // the other clients should NOT see that change because of auto-commit
- assertThat(client.submit("g.V().has('name','daniel').hasNext()").all().get().get(0).getBoolean(), is(false));
- assertThat(sessionWithManagedTx.submit("g.V().has('name','daniel').hasNext()").all().get().get(0).getBoolean(), is(false));
-
- // but "v" should still be there
- final Vertex vDanielAgain = sessionWithoutManagedTx.submit("v").all().get().get(0).getVertex();
- assertEquals("daniel", vDanielAgain.value("name"));
-
- // now commit manually
- sessionWithoutManagedTx.submit("g.tx().commit()").all().get();
-
- // should be there for all now
- assertThat(client.submit("g.V().has('name','daniel').hasNext()").all().get().get(0).getBoolean(), is(true));
- assertThat(sessionWithManagedTx.submit("g.V().has('name','daniel').hasNext()").all().get().get(0).getBoolean(), is(true));
- assertThat(sessionWithoutManagedTx.submit("g.V().has('name','daniel').hasNext()").all().get().get(0).getBoolean(), is(true));
-
- cluster.close();
- }
+// @Test
+// public void shouldRequireAliasedGraphVariablesInStrictTransactionMode() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit("1+1").all().get();
+// fail("Should have tossed an exception because strict mode is on and no aliasing was performed");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, instanceOf(ResponseException.class));
+// final ResponseException re = (ResponseException) root;
+// assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode());
+// }
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldAliasGraphVariablesInStrictTransactionMode() throws Exception {
+// assumeNeo4jIsPresent();
+//
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit("g.addVertex('name','stephen');").all().get().get(0).getVertex();
+// fail("Should have tossed an exception because \"g\" does not have the addVertex method under default config");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, instanceOf(ResponseException.class));
+// final ResponseException re = (ResponseException) root;
+// assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode());
+// }
+//
+// // keep the testing here until "rebind" is completely removed
+// final Client reboundLegacy = cluster.connect().rebind("graph");
+// final Vertex vLegacy = reboundLegacy.submit("g.addVertex('name','stephen')").all().get().get(0).getVertex();
+// assertEquals("stephen", vLegacy.value("name"));
+//
+// final Client rebound = cluster.connect().alias("graph");
+// final Vertex v = rebound.submit("g.addVertex('name','jason')").all().get().get(0).getVertex();
+// assertEquals("jason", v.value("name"));
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldAliasGraphVariables() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit("g.addVertex('name','stephen');").all().get().get(0).getVertex();
+// fail("Should have tossed an exception because \"g\" does not have the addVertex method under default config");
+// } catch (Exception ex) {
+// final Throwable root = ExceptionUtils.getRootCause(ex);
+// assertThat(root, instanceOf(ResponseException.class));
+// final ResponseException re = (ResponseException) root;
+// assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, re.getResponseStatusCode());
+// }
+//
+// // keep the testing here until "rebind" is completely removed
+// final Client reboundLegacy = cluster.connect().rebind("graph");
+// final Vertex vLegacy = reboundLegacy.submit("g.addVertex('name','stephen')").all().get().get(0).getVertex();
+// assertEquals("stephen", vLegacy.value("name"));
+//
+// final Client rebound = cluster.connect().alias("graph");
+// final Vertex v = rebound.submit("g.addVertex('name','jason')").all().get().get(0).getVertex();
+// assertEquals("jason", v.value("name"));
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldAliasTraversalSourceVariables() throws Exception {
+// final Cluster cluster = Cluster.build().create();
+// final Client client = cluster.connect();
+//
+// try {
+// cli
<TRUNCATED>