From dfcb1ca020ad6f639e4130f131d4ac36f1e51351 Mon Sep 17 00:00:00 2001 From: lvca Date: Tue, 27 Dec 2022 21:15:47 -0500 Subject: [PATCH] new: gremlin execution timeout Now you can set the timeout for gremlin with (100secs): alter database `arcadedb.gremlin.timeout` 100000 --- .../java/com/arcadedb/GlobalConfiguration.java | 2 ++ .../gremlin/arcadedb/structure/ArcadeGraph.java | 16 ++++++++++++++-- .../gremlin/arcadedb/CypherQueryEngineTest.java | 13 ++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/engine/src/main/java/com/arcadedb/GlobalConfiguration.java b/engine/src/main/java/com/arcadedb/GlobalConfiguration.java index c27196261..7c9dd2942 100644 --- a/engine/src/main/java/com/arcadedb/GlobalConfiguration.java +++ b/engine/src/main/java/com/arcadedb/GlobalConfiguration.java @@ -170,6 +170,8 @@ public Object call(final Object value) { // COMMAND COMMAND_TIMEOUT("arcadedb.command.timeout", "Default timeout for commands (in ms)", Long.class, 0), + GREMLIN_COMMAND_TIMEOUT("arcadedb.gremlin.timeout", "Default timeout for gremlin commands (in ms)", Long.class, 8_000), + // USER CODE POLYGLOT_COMMAND_TIMEOUT("arcadedb.polyglotCommand.timeout", "Default timeout for polyglot commands (in ms)", Long.class, 10_000), diff --git a/gremlin/src/main/java/org/apache/tinkerpop/gremlin/arcadedb/structure/ArcadeGraph.java b/gremlin/src/main/java/org/apache/tinkerpop/gremlin/arcadedb/structure/ArcadeGraph.java index 09ef9ffdd..da77bbe0d 100644 --- a/gremlin/src/main/java/org/apache/tinkerpop/gremlin/arcadedb/structure/ArcadeGraph.java +++ b/gremlin/src/main/java/org/apache/tinkerpop/gremlin/arcadedb/structure/ArcadeGraph.java @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.gremlin.arcadedb.structure; +import com.arcadedb.GlobalConfiguration; import com.arcadedb.database.Database; import com.arcadedb.database.DatabaseFactory; import com.arcadedb.database.RID; @@ -65,6 +66,9 @@ @Graph.OptIn("org.apache.tinkerpop.gremlin.arcadedb.structure.DebugStructureSuite") public class ArcadeGraph implements Graph, Closeable { + public static final String CONFIG_DIRECTORY = "gremlin.arcadedb.directory"; + public static final String CONFIG_EVALUATION_TIMEOUT = "gremlin.evaluationTimeout"; + //private final ArcadeVariableFeatures graphVariables = new ArcadeVariableFeatures(); private final ArcadeGraphTransaction transaction; protected final Database database; @@ -105,11 +109,14 @@ protected ArcadeGraph(final Configuration configuration) { protected ArcadeGraph(final Database database) { this.database = database; this.transaction = new ArcadeGraphTransaction(this); + + if (database.getConfiguration().hasValue(GlobalConfiguration.GREMLIN_COMMAND_TIMEOUT.getKey())) + // SET CUSTOM TIMEOUT + configuration.setProperty(CONFIG_EVALUATION_TIMEOUT, database.getConfiguration().getValueAsLong(GlobalConfiguration.GREMLIN_COMMAND_TIMEOUT)); + init(); } - public static final String CONFIG_DIRECTORY = "gremlin.arcadedb.directory"; - @Override public Features features() { return features; @@ -417,6 +424,11 @@ private void init() { final GremlinExecutor.Builder builder = GremlinExecutor.build(); builder.globalBindings(globalBindings); + + if (configuration.containsKey(CONFIG_EVALUATION_TIMEOUT)) + // SET CUSTOM TIMEOUT + builder.evaluationTimeout(configuration.getLong(CONFIG_EVALUATION_TIMEOUT)); + gremlinExecutor = builder.create(); } } diff --git a/gremlin/src/test/java/org/apache/tinkerpop/gremlin/arcadedb/CypherQueryEngineTest.java b/gremlin/src/test/java/org/apache/tinkerpop/gremlin/arcadedb/CypherQueryEngineTest.java index 48470dd43..115e150d6 100644 --- a/gremlin/src/test/java/org/apache/tinkerpop/gremlin/arcadedb/CypherQueryEngineTest.java +++ b/gremlin/src/test/java/org/apache/tinkerpop/gremlin/arcadedb/CypherQueryEngineTest.java @@ -25,6 +25,8 @@ import com.arcadedb.schema.Schema; import com.arcadedb.utility.FileUtils; import org.apache.commons.collections.IteratorUtils; +import org.apache.commons.configuration2.BaseConfiguration; +import org.apache.commons.configuration2.Configuration; import org.apache.tinkerpop.gremlin.arcadedb.structure.ArcadeGraph; import org.json.JSONObject; import org.junit.jupiter.api.AfterEach; @@ -34,9 +36,10 @@ import java.io.*; import java.util.*; -import java.util.concurrent.*; import java.util.stream.*; +import static org.apache.tinkerpop.gremlin.arcadedb.structure.ArcadeGraph.CONFIG_DIRECTORY; +import static org.apache.tinkerpop.gremlin.arcadedb.structure.ArcadeGraph.CONFIG_EVALUATION_TIMEOUT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; @@ -49,8 +52,12 @@ public class CypherQueryEngineTest { private static final String DB_PATH = "./target/testsql"; @Test - public void verifyProjectionWithCollectFunction() throws ExecutionException, InterruptedException { - final ArcadeGraph graph = ArcadeGraph.open(DB_PATH); + public void verifyProjectionWithCollectFunction() { + final Configuration config = new BaseConfiguration(); + config.setProperty(CONFIG_DIRECTORY, DB_PATH); + config.setProperty(CONFIG_EVALUATION_TIMEOUT, 180000); + + final ArcadeGraph graph = ArcadeGraph.open(config); try (Database database = graph.getDatabase()) { database.transaction(() -> { Schema schema = database.getSchema();