Repository: asterixdb Updated Branches: refs/heads/master 33af12dff -> db1c115ec
+= PollQuery Test File Type pollquery test type files will run the query every polldelaysecs [default:1] seconds for up to polltimeoutsecs seconds or until the correct result is found. This avoids unnecessarily long or dangerously short sleeps to wait for some asynchronous operation to complete. Usage: polltimeoutsecs=nnn must be present somewhere in your file, otherwise an error is thrown. Optionally, polldelaysecs=nnn can be also present to override the default poll frequency of 1s. Change-Id: I7e4c67c74debf8253479257a1c54d6426a9531d8 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1267 Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Michael Blow <mb...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/db1c115e Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/db1c115e Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/db1c115e Branch: refs/heads/master Commit: db1c115ec5270fbaf0556a9f9abd6c40978e67a4 Parents: 33af12d Author: Michael Blow <mb...@apache.org> Authored: Tue Oct 11 02:29:50 2016 -0400 Committer: Michael Blow <mb...@apache.org> Committed: Tue Oct 11 00:06:48 2016 -0700 ---------------------------------------------------------------------- .../feed-with-external-function.4.sleep.aql | 19 --------- .../feed-with-external-function.5.pollquery.aql | 33 ++++++++++++++++ .../feed-with-external-function.5.query.aql | 32 --------------- .../apache/asterix/test/aql/TestExecutor.java | 41 ++++++++++++++++++++ 4 files changed, 74 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/db1c115e/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.4.sleep.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.4.sleep.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.4.sleep.aql deleted file mode 100644 index af2f691..0000000 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.4.sleep.aql +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -10000 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/db1c115e/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.pollquery.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.pollquery.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.pollquery.aql new file mode 100644 index 0000000..f095804 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.pollquery.aql @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Description : Create a feed dataset that uses the feed simulator adapter. + The feed simulator simulates feed from a file in the local fs. + Associate with the feed an external user-defined function. The UDF + finds topics in each tweet. A topic is identified by a #. + Begin ingestion and apply external user defined function + * Expected Res : Success + * Date : 23rd Apr 2013 + */ +// polltimeoutsecs=30 +use dataverse externallibtest; + +for $x in dataset TweetsFeedIngest +order by $x.id +return $x http://git-wip-us.apache.org/repos/asf/asterixdb/blob/db1c115e/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.query.aql ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.query.aql deleted file mode 100644 index 8879fa8..0000000 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.5.query.aql +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/* - * Description : Create a feed dataset that uses the feed simulator adapter. - The feed simulator simulates feed from a file in the local fs. - Associate with the feed an external user-defined function. The UDF - finds topics in each tweet. A topic is identified by a #. - Begin ingestion and apply external user defined function - * Expected Res : Success - * Date : 23rd Apr 2013 - */ -use dataverse externallibtest; - -for $x in dataset TweetsFeedIngest -order by $x.id -return $x http://git-wip-us.apache.org/repos/asf/asterixdb/blob/db1c115e/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java index 08a0342..29c0afd 100644 --- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java +++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; @@ -81,6 +82,10 @@ public class TestExecutor { private static final Pattern JAVA_BLOCK_COMMENT_PATTERN = Pattern.compile("/\\*.*\\*/", Pattern.MULTILINE | Pattern.DOTALL); private static final Pattern REGEX_LINES_PATTERN = Pattern.compile("^(-)?/(.*)/([im]*)$"); + private static final Pattern POLL_TIMEOUT_PATTERN = + Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)", Pattern.MULTILINE); + private static final Pattern POLL_DELAY_PATTERN = Pattern.compile("polldelaysecs=(\\d+)(\\D|$)", Pattern.MULTILINE); + private static Method managixExecuteMethod = null; private static final HashMap<Integer, ITestServer> runningTestServers = new HashMap<>(); @@ -658,6 +663,42 @@ public class TestExecutor { ResultExtractor.extract(resultStream); } break; + case "pollquery": + // polltimeoutsecs=nnn, polldelaysecs=nnn + final Matcher timeoutMatcher = POLL_TIMEOUT_PATTERN.matcher(statement); + int timeoutSecs; + if (timeoutMatcher.find()) { + timeoutSecs = Integer.parseInt(timeoutMatcher.group(1)); + } else { + throw new IllegalArgumentException("ERROR: polltimeoutsecs=nnn must be present in poll file"); + } + final Matcher retryDelayMatcher = POLL_DELAY_PATTERN.matcher(statement); + int retryDelaySecs = retryDelayMatcher.find() ? Integer.parseInt(timeoutMatcher.group(1)) : 1; + long startTime = System.currentTimeMillis(); + long limitTime = startTime + TimeUnit.SECONDS.toMillis(timeoutSecs); + ctx.setType(ctx.getType().substring("poll".length())); + Exception finalException; + LOGGER.fine("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay"); + while (true) { + try { + executeTest(testCaseCtx, ctx, statement, isDmlRecoveryTest, pb, cUnit, queryCount, + expectedResultFileCtxs, testFile, actualPath); + finalException = null; + break; + } catch (Exception e) { + if ((System.currentTimeMillis() > limitTime)) { + finalException = e; + break; + } + LOGGER.fine("sleeping " + retryDelaySecs + " second(s) before polling again"); + Thread.sleep(TimeUnit.SECONDS.toMillis(retryDelaySecs)); + } + } + if (finalException != null) { + throw new Exception("Poll limit (" + timeoutSecs + "s) exceeded without obtaining expected result", + finalException); + } + break; case "query": case "async": case "asyncdefer":