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 e0412a67ed65218a6e0ff8c7d9ca10475f0ec362 Author: Stephen Mallette <[email protected]> AuthorDate: Tue Dec 28 18:30:17 2021 -0500 Reduced resources consumed by gremlin server integration tests Prevented neo4j configuration if neo4j not enabled in build helping stop errors in the log. Close Cluster instances after tests. Not doing so seems to leak connection pools which not only consumes memory but floods the logs with fake failures. Reduced the memory footprint of neo4j for testing by modifying its default configurations. Added some changes to help try to release resources held by Gremlin Server. Specifically, called close() on GraphTraversalSource instances in the GraphMan [...] --- gremlin-server/conf/neo4j-empty.properties | 6 ++ .../tinkerpop/gremlin/server/GremlinServer.java | 35 ++++++++- .../driver/remote/AbstractRemoteGraphProvider.java | 6 ++ .../AbstractGremlinServerIntegrationTest.java | 25 +++++- .../gremlin/server/GremlinDriverIntegrateTest.java | 89 +++++++++++----------- .../server/GremlinServerHttpIntegrateTest.java | 6 +- .../gremlin/server/GremlinServerIntegrateTest.java | 35 +++++++-- .../server/GremlinServerSessionIntegrateTest.java | 15 +--- 8 files changed, 145 insertions(+), 72 deletions(-) diff --git a/gremlin-server/conf/neo4j-empty.properties b/gremlin-server/conf/neo4j-empty.properties index d1ad61e..f20aa30 100644 --- a/gremlin-server/conf/neo4j-empty.properties +++ b/gremlin-server/conf/neo4j-empty.properties @@ -34,6 +34,12 @@ gremlin.neo4j.conf.dbms.auto_index.nodes.enabled=true gremlin.neo4j.conf.dbms.auto_index.relationships.enabled=true #gremlin.neo4j.conf.dbms.auto_index.relationships.keys= +# these memory settings are likely unsuitable for production cases +gremlin.neo4j.conf.dbms.memory.heap.initial_size=500m +gremlin.neo4j.conf.dbms.memory.heap.max_size=500m +gremlin.neo4j.conf.dbms.memory.pagecache.size=1m +gremlin.neo4j.conf.dbms.tx_state.memory_allocation=ON_HEAP + # uncomment the following to enable Bolt on the specified port # gremlin.neo4j.conf.dbms.connector.0.type=BOLT # gremlin.neo4j.conf.dbms.connector.0.enabled=true diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java index 2a1adf7..1e16ea1 100644 --- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java +++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java @@ -39,12 +39,15 @@ import org.apache.tinkerpop.gremlin.server.util.LifeCycleHook; import org.apache.tinkerpop.gremlin.server.util.MetricManager; import org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor; import org.apache.tinkerpop.gremlin.server.util.ThreadFactoryUtil; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.apache.tinkerpop.gremlin.util.Gremlin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.lang.reflect.UndeclaredThrowableException; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; @@ -296,16 +299,44 @@ public class GremlinServer { logger.warn("Timeout waiting for boss/worker thread pools to shutdown - continuing with shutdown process."); } + // close TraversalSource and Graph instances - there aren't guarantees that closing Graph will close all + // spawned TraversalSource instances so both should be closed directly and independently. if (serverGremlinExecutor != null) { - serverGremlinExecutor.getGraphManager().getGraphNames().forEach(gName -> { + final Set<String> traversalSourceNames = serverGremlinExecutor.getGraphManager().getTraversalSourceNames(); + traversalSourceNames.forEach(traversalSourceName -> { + logger.debug("Closing GraphTraversalSource instance [{}]", traversalSourceName); + try { + serverGremlinExecutor.getGraphManager().getTraversalSource(traversalSourceName).close(); + } catch (Exception ex) { + logger.warn(String.format("Exception while closing GraphTraversalSource instance [%s]", traversalSourceName), ex); + } finally { + logger.info("Closed GraphTraversalSource instance [{}]", traversalSourceName); + } + + try { + serverGremlinExecutor.getGraphManager().removeTraversalSource(traversalSourceName); + } catch (Exception ex) { + logger.warn(String.format("Exception while removing GraphTraversalSource instance [%s] from GraphManager", traversalSourceName), ex); + } + }); + + final Set<String> graphNames = serverGremlinExecutor.getGraphManager().getGraphNames(); + graphNames.forEach(gName -> { logger.debug("Closing Graph instance [{}]", gName); try { - serverGremlinExecutor.getGraphManager().getGraph(gName).close(); + final Graph graph = serverGremlinExecutor.getGraphManager().getGraph(gName); + graph.close(); } catch (Exception ex) { logger.warn(String.format("Exception while closing Graph instance [%s]", gName), ex); } finally { logger.info("Closed Graph instance [{}]", gName); } + + try { + serverGremlinExecutor.getGraphManager().removeGraph(gName); + } catch (Exception ex) { + logger.warn(String.format("Exception while removing Graph instance [%s] from GraphManager", gName), ex); + } }); } diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java index e86a546..696669f 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java @@ -237,6 +237,12 @@ public abstract class AbstractRemoteGraphProvider extends AbstractGraphProvider @Override public void close() throws Exception { try { + cluster.close(); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + + try { stopServer(); } catch (Exception ex) { throw new RuntimeException(ex); diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/AbstractGremlinServerIntegrationTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/AbstractGremlinServerIntegrationTest.java index 634063e..c394531 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/AbstractGremlinServerIntegrationTest.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/AbstractGremlinServerIntegrationTest.java @@ -19,6 +19,7 @@ package org.apache.tinkerpop.gremlin.server; import org.apache.tinkerpop.gremlin.server.op.OpLoader; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -130,9 +131,15 @@ public abstract class AbstractGremlinServerIntegrationTest { } public void stopServer() throws Exception { + // calling close() on TinkerGraph does not free resources quickly enough. adding a clear() call let's gc + // cleanup earlier + server.getServerGremlinExecutor().getGraphManager().getAsBindings().values().stream() + .filter(g -> g instanceof TinkerGraph).forEach(g -> ((TinkerGraph) g).clear()); + if (server != null) { server.stop().join(); } + // reset the OpLoader processors so that they can get reconfigured on startup - Settings may have changed // between tests OpLoader.reset(); @@ -155,14 +162,24 @@ public abstract class AbstractGremlinServerIntegrationTest { return (directory.delete()); } - protected static void assumeNeo4jIsPresent() { - boolean neo4jIncludedForTesting; + protected static void tryIncludeNeo4jGraph(final Settings settings) { + if (isNeo4jPresent()) { + deleteDirectory(new File("/tmp/neo4j")); + settings.graphs.put("graph", "conf/neo4j-empty.properties"); + } + } + + protected static boolean isNeo4jPresent() { try { Class.forName("org.neo4j.tinkerpop.api.impl.Neo4jGraphAPIImpl"); - neo4jIncludedForTesting = true; + return true; } catch (Exception ex) { - neo4jIncludedForTesting = false; + return false; } + } + + protected static void assumeNeo4jIsPresent() { + boolean neo4jIncludedForTesting = isNeo4jPresent(); assumeThat("Neo4j implementation was not included for testing - run with -DincludeNeo4j", neo4jIncludedForTesting, is(true)); } } 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 2eb6aa7..15b3004 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 @@ -185,16 +185,14 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration case "shouldExecuteScriptInSessionOnTransactionalWithManualTransactionsGraph": case "shouldExecuteInSessionAndSessionlessWithoutOpeningTransaction": case "shouldManageTransactionsInSession": - deleteDirectory(new File("/tmp/neo4j")); - settings.graphs.put("graph", "conf/neo4j-empty.properties"); + tryIncludeNeo4jGraph(settings); break; case "shouldRequireAliasedGraphVariablesInStrictTransactionMode": settings.strictTransactionManagement = true; break; case "shouldAliasGraphVariablesInStrictTransactionMode": settings.strictTransactionManagement = true; - deleteDirectory(new File("/tmp/neo4j")); - settings.graphs.put("graph", "conf/neo4j-empty.properties"); + tryIncludeNeo4jGraph(settings); break; case "shouldProcessSessionRequestsInOrderAfterTimeout": settings.evaluationTimeout = 250; @@ -671,6 +669,8 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration assertThat("Should contain 2 results", results.size() == 2); assertThat("The numeric result should be 1", results.contains(1L)); assertThat("The string result contain label person", results.contains("person")); + + executor.shutdown(); } finally { cluster.close(); } @@ -1022,7 +1022,6 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration final Client client = cluster.connect(); try { - final List<Result> r = client.submit("TinkerFactory.createModern().traversal().V(1)").all().join(); assertEquals(1, r.size()); @@ -1502,9 +1501,9 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration assertThat(root, instanceOf(ResponseException.class)); final ResponseException re = (ResponseException) root; assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode()); + } finally { + cluster.close(); } - - cluster.close(); } @Test @@ -1522,13 +1521,13 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration assertThat(root, instanceOf(ResponseException.class)); final ResponseException re = (ResponseException) root; assertEquals(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS, re.getResponseStatusCode()); - } - - 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(); + 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")); + } finally { + cluster.close(); + } } @Test @@ -1544,13 +1543,13 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration assertThat(root, instanceOf(ResponseException.class)); final ResponseException re = (ResponseException) root; assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, re.getResponseStatusCode()); - } - - 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(); + 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")); + } finally { + cluster.close(); + } } @Test @@ -1786,6 +1785,7 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration final Client client = Mockito.spy(cluster.connect().alias("g")); client.submit("", RequestOptions.build().userAgent("test").create()).all().get(); cluster.close(); + final ArgumentCaptor<RequestMessage> requestMessageCaptor = ArgumentCaptor.forClass(RequestMessage.class); verify(client).submitAsync(requestMessageCaptor.capture()); final RequestMessage requestMessage = requestMessageCaptor.getValue(); @@ -1800,14 +1800,15 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration final GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(client)); g.with(Tokens.ARGS_USER_AGENT, "test").V().iterate(); cluster.close(); - ArgumentCaptor<RequestOptions> requestOptionsCaptor = ArgumentCaptor.forClass(RequestOptions.class); + + final ArgumentCaptor<RequestOptions> requestOptionsCaptor = ArgumentCaptor.forClass(RequestOptions.class); verify(client).submitAsync(Mockito.any(Bytecode.class), requestOptionsCaptor.capture()); - RequestOptions requestOptions = requestOptionsCaptor.getValue(); + final RequestOptions requestOptions = requestOptionsCaptor.getValue(); assertEquals("test", requestOptions.getUserAgent().get()); - ArgumentCaptor<RequestMessage> requestMessageCaptor = ArgumentCaptor.forClass(RequestMessage.class); + final ArgumentCaptor<RequestMessage> requestMessageCaptor = ArgumentCaptor.forClass(RequestMessage.class); verify(client).submitAsync(requestMessageCaptor.capture()); - RequestMessage requestMessage = requestMessageCaptor.getValue(); + final RequestMessage requestMessage = requestMessageCaptor.getValue(); assertEquals("test", requestMessage.getArgs().getOrDefault(Tokens.ARGS_USER_AGENT, null)); } @@ -1815,32 +1816,29 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration public void shouldSendRequestIdBytecode() { final UUID overrideRequestId = UUID.randomUUID(); final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V3D0).create(); - final Client client = Mockito.spy(cluster.connect().alias("g")); - Mockito.when(client.alias("g")).thenReturn(client); - GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(client)); - g.with(Tokens.REQUEST_ID, overrideRequestId).V().iterate(); - cluster.close(); - ArgumentCaptor<RequestOptions> requestOptionsCaptor = ArgumentCaptor.forClass(RequestOptions.class); - verify(client).submitAsync(Mockito.any(Bytecode.class), requestOptionsCaptor.capture()); - RequestOptions requestOptions = requestOptionsCaptor.getValue(); - assertTrue(requestOptions.getOverrideRequestId().isPresent()); - assertEquals(overrideRequestId, requestOptions.getOverrideRequestId().get()); + final Client client = Mockito.spy(cluster.connect().alias("g")); + Mockito.when(client.alias("g")).thenReturn(client); + final GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(client)); + g.with(Tokens.REQUEST_ID, overrideRequestId).V().iterate(); + cluster.close(); - ArgumentCaptor<RequestMessage> requestMessageCaptor = ArgumentCaptor.forClass(RequestMessage.class); - verify(client).submitAsync(requestMessageCaptor.capture()); - RequestMessage requestMessage = requestMessageCaptor.getValue(); - assertEquals(overrideRequestId, requestMessage.getRequestId()); + final ArgumentCaptor<RequestOptions> requestOptionsCaptor = ArgumentCaptor.forClass(RequestOptions.class); + verify(client).submitAsync(Mockito.any(Bytecode.class), requestOptionsCaptor.capture()); + final RequestOptions requestOptions = requestOptionsCaptor.getValue(); + assertTrue(requestOptions.getOverrideRequestId().isPresent()); + assertEquals(overrideRequestId, requestOptions.getOverrideRequestId().get()); + final ArgumentCaptor<RequestMessage> requestMessageCaptor = ArgumentCaptor.forClass(RequestMessage.class); + verify(client).submitAsync(requestMessageCaptor.capture()); + final RequestMessage requestMessage = requestMessageCaptor.getValue(); + assertEquals(overrideRequestId, requestMessage.getRequestId()); } private void assertFutureTimeout(final CompletableFuture<List<Result>> futureFirst) { - try - { + try { futureFirst.get(); fail("Should have timed out"); - } - catch (Exception ex) - { + } catch (Exception ex) { final Throwable root = ExceptionUtils.getRootCause(ex); assertThat(root, instanceOf(ResponseException.class)); assertThat(root.getMessage(), startsWith("Evaluation exceeded the configured 'evaluationTimeout' threshold of 250 ms")); @@ -1873,9 +1871,10 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration // should get a rejection here final Throwable root = ExceptionUtils.getRootCause(ex); assertThat(root.getMessage(), startsWith("There is already a request pending with an id of:")); + assertEquals(100, result1.get().one().getInt()); + } finally { + cluster.close(); } - - assertEquals(100, result1.get().one().getInt()); } /** @@ -1895,7 +1894,7 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration logger.info("Verifying driver cannot connect to server."); client.submit("g").all().get(500, TimeUnit.MILLISECONDS); fail("Should throw an exception."); - } catch (RuntimeException re) { + } catch (Exception re) { // Client would have no active connections to the host, hence it would encounter a timeout // trying to find an alive connection to the host. assertThat(re.getCause(), instanceOf(NoHostAvailableException.class)); diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java index 8916ee9..9eefa76 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java @@ -73,13 +73,11 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra settings.maxContentLength = 31; break; case "should200OnPOSTTransactionalGraph": - deleteDirectory(new File("/tmp/neo4j")); - settings.graphs.put("graph", "conf/neo4j-empty.properties"); + tryIncludeNeo4jGraph(settings); break; case "should200OnPOSTTransactionalGraphInStrictMode": + tryIncludeNeo4jGraph(settings); settings.strictTransactionManagement = true; - deleteDirectory(new File("/tmp/neo4j")); - settings.graphs.put("graph", "conf/neo4j-empty.properties"); break; case "should200OnPOSTWithGraphSON1d0AcceptHeaderDefaultResultToJson": settings.serializers.clear(); diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java index 8a63694..4a95ae3 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java @@ -267,6 +267,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration assertThat(t, instanceOf(ResponseException.class)); assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode()); } + + g.close(); } @Test @@ -285,7 +287,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration @Test public void shouldPingChannelIfClientDies() throws Exception { - final Client client = TestClientFactory.build().maxConnectionPoolSize(1).minConnectionPoolSize(1).keepAliveInterval(0).create().connect(); + final Cluster cluster = TestClientFactory.build().maxConnectionPoolSize(1).minConnectionPoolSize(1).keepAliveInterval(0).create(); + final Client client = cluster.connect(); client.submit("1+1").all().get(); // since we do nothing for 3 seconds and the time limit for ping is 1 second we should get *about* 3 pings - @@ -293,7 +296,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration // there record Thread.sleep(3000); - client.close(); + cluster.close(); // stop the server to be sure that logs flush stopServer(); @@ -327,6 +330,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration assertThat(t, instanceOf(ResponseException.class)); assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode()); } + + g.close(); } @Test @@ -355,10 +360,12 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration assertThat(t, instanceOf(ResponseException.class)); assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode()); } + + g.close(); } @Test - public void shouldTimeOutRemoteTraversalWithPerRequestOption() { + public void shouldTimeOutRemoteTraversalWithPerRequestOption() throws Exception { final GraphTraversalSource g = traversal().withRemote(conf); try { @@ -383,6 +390,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration assertThat(t, instanceOf(ResponseException.class)); assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode()); } + + g.close(); } @Test @@ -980,6 +989,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration g.addV("person").property("age", 20).iterate(); g.addV("person").property("age", 10).iterate(); assertEquals(50L, g.V().hasLabel("person").map(Lambda.function("it.get().value('age') + 10")).sum().next()); + g.close(); } @Test @@ -1018,6 +1028,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration gdotv.toList(); final DriverRemoteTraversalSideEffects gdotvSe = (DriverRemoteTraversalSideEffects) gdotv.asAdmin().getSideEffects(); assertThat(gdotvSe.statusAttributes().containsKey(Tokens.ARGS_HOST), is(true)); + + g.close(); } @Test @@ -1068,6 +1080,9 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration error = true; } assertThat(error, is(true)); + + g.close(); + cluster.close(); } @Test @@ -1083,7 +1098,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration traversal.hasNext(); // start a separate thread to iterate - final Thread t = new Thread(traversal::iterate); + final Thread t = new Thread(traversal::iterate, name.getMethodName()); t.start(); // blocks here until traversal iteration is complete @@ -1110,6 +1125,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration final BulkSet localBSideEffects = se.get("b"); assertThat(localBSideEffects.isEmpty(), is(false)); + + g.close(); } @Test @@ -1125,7 +1142,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration traversal.hasNext(); // start a separate thread to iterate - final Thread t = new Thread(traversal::iterate); + final Thread t = new Thread(traversal::iterate, name.getMethodName()); t.start(); // blocks here until traversal iteration is complete @@ -1152,6 +1169,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration final BulkSet localBSideEffects = se.get("b"); assertThat(localBSideEffects.isEmpty(), is(false)); + + g.close(); } @Test @@ -1163,7 +1182,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration g.addV("person").property("age", 20).promise(Traversal::iterate).join(); final Traversal<Vertex,Integer> traversal = g.V().hasLabel("person").has("age", 20).values("age"); - int age = traversal.promise(t -> t.next(1).get(0)).join(); + final int age = traversal.promise(t -> t.next(1).get(0)).join(); assertEquals(20, age); assertEquals(20, (int)traversal.next()); assertThat(traversal.hasNext(), is(false)); @@ -1174,6 +1193,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration assertThat(traversalCloned.promise(t -> ((Traversal) t).hasNext()).join(), is(false)); assertEquals(3, g.V().promise(Traversal::toList).join().size()); + + g.close(); } @Test @@ -1199,6 +1220,8 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration fail("Should have tanked out because of number of parameters used and size of the compile script"); } catch (Exception ex) { assertThat(ex.getMessage(), containsString("The Gremlin statement that was submitted exceeds the maximum compilation size allowed by the JVM")); + } finally { + cluster.close(); } } } 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 ddf39d3..5af4f60 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 @@ -103,7 +103,10 @@ public class GremlinServerSessionIntegrateTest extends AbstractGremlinServerInte break; case "shouldBlockAdditionalRequestsDuringClose": case "shouldBlockAdditionalRequestsDuringForceClose": - clearNeo4j(settings); + case "shouldExecuteInSessionAndSessionlessWithoutOpeningTransactionWithSingleClient": + case "shouldExecuteInSessionWithTransactionManagement": + case "shouldRollbackOnEvalExceptionForManagedTransaction": + tryIncludeNeo4jGraph(settings); break; case "shouldEnsureSessionBindingsAreThreadSafe": settings.threadPoolWorker = 2; @@ -116,21 +119,11 @@ public class GremlinServerSessionIntegrateTest extends AbstractGremlinServerInte processorSettingsForDisableFunctionCache.config.put(SessionOpProcessor.CONFIG_GLOBAL_FUNCTION_CACHE_ENABLED, false); settings.processors.add(processorSettingsForDisableFunctionCache); break; - case "shouldExecuteInSessionAndSessionlessWithoutOpeningTransactionWithSingleClient": - case "shouldExecuteInSessionWithTransactionManagement": - case "shouldRollbackOnEvalExceptionForManagedTransaction": - clearNeo4j(settings); - break; } return settings; } - private static void clearNeo4j(Settings settings) { - deleteDirectory(new File("/tmp/neo4j")); - settings.graphs.put("graph", "conf/neo4j-empty.properties"); - } - @Test public void shouldUseGlobalFunctionCache() throws Exception { final Cluster cluster = TestClientFactory.open();
