This is an automated email from the ASF dual-hosted git repository.
gabriellee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 0f3e97f9c5b [regression-test][framework] support cases that can only
run in non-concurrent-mode. (#26487)
0f3e97f9c5b is described below
commit 0f3e97f9c5b8d655544c8cc335ec3fbf0b0535ee
Author: shuke <[email protected]>
AuthorDate: Wed Nov 8 12:46:36 2023 +0800
[regression-test][framework] support cases that can only run in
non-concurrent-mode. (#26487)
---
.../apache/doris/regression/RegressionTest.groovy | 59 +++++++++++++++++++---
.../pipeline/p0/conf/regression-conf.groovy | 2 +-
.../pipeline/p1/conf/regression-conf.groovy | 2 +-
.../test_index_fault_injection.groovy | 2 +-
.../test_segcompaction_fault_injection.groovy | 2 +-
.../test_too_many_segments_fault_injection.groovy | 2 +-
.../sql_block_rule_p0/test_sql_block_rule.groovy | 2 +-
7 files changed, 59 insertions(+), 12 deletions(-)
diff --git
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/RegressionTest.groovy
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/RegressionTest.groovy
index 4e7a5793aa5..6cdb918a7f4 100644
---
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/RegressionTest.groovy
+++
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/RegressionTest.groovy
@@ -50,9 +50,11 @@ class RegressionTest {
static GroovyShell shell
static ExecutorService scriptExecutors
static ExecutorService suiteExecutors
+ static ExecutorService singleSuiteExecutors
static ExecutorService actionExecutors
static ThreadLocal<Integer> threadLoadedClassNum = new ThreadLocal<>()
static final int cleanLoadedClassesThreshold = 20
+ static String nonConcurrentTestGroup = "nonConcurrent"
static void main(String[] args) {
CommandLine cmd = ConfigOptions.initCommands(args)
@@ -70,6 +72,7 @@ class RegressionTest {
}
actionExecutors.shutdown()
suiteExecutors.shutdown()
+ singleSuiteExecutors.shutdown()
scriptExecutors.shutdown()
log.info("Test finished")
if (!success) {
@@ -96,6 +99,12 @@ class RegressionTest {
.build();
suiteExecutors = Executors.newFixedThreadPool(config.suiteParallel,
suiteFactory)
+ BasicThreadFactory singleSuiteFactory = new
BasicThreadFactory.Builder()
+ .namingPattern("non-concurrent-thread-%d")
+ .priority(Thread.MAX_PRIORITY)
+ .build();
+ singleSuiteExecutors = Executors.newFixedThreadPool(1,
singleSuiteFactory)
+
BasicThreadFactory actionFactory = new BasicThreadFactory.Builder()
.namingPattern("action-thread-%d")
.priority(Thread.MAX_PRIORITY)
@@ -131,9 +140,9 @@ class RegressionTest {
return sources
}
- static void runScript(Config config, ScriptSource source, Recorder
recorder) {
+ static void runScript(Config config, ScriptSource source, Recorder
recorder, boolean isSingleThreadScript) {
def suiteFilter = { String suiteName, String groupName ->
- canRun(config, suiteName, groupName)
+ canRun(config, suiteName, groupName, isSingleThreadScript)
}
def file = source.getFile()
int failureLimit =
Integer.valueOf(config.otherConfigs.getOrDefault("max_failure_num",
"-1").toString());
@@ -144,7 +153,14 @@ class RegressionTest {
return;
}
def eventListeners = getEventListeners(config, recorder)
- new ScriptContext(file, suiteExecutors, actionExecutors,
+ ExecutorService executors = null
+ if (isSingleThreadScript) {
+ executors = singleSuiteExecutors
+ } else {
+ executors = suiteExecutors
+ }
+
+ new ScriptContext(file, executors, actionExecutors,
config, eventListeners, suiteFilter).start { scriptContext ->
try {
SuiteScript suiteScript = source.toScript(scriptContext, shell)
@@ -168,7 +184,26 @@ class RegressionTest {
scriptSources.eachWithIndex { source, i ->
// log.info("Prepare scripts [${i + 1}/${totalFile}]".toString())
def future = scriptExecutors.submit {
- runScript(config, source, recorder)
+ runScript(config, source, recorder, false)
+ }
+ futures.add(future)
+ }
+
+ // wait all scripts
+ for (Future future : futures) {
+ try {
+ future.get()
+ } catch (Throwable t) {
+ // do nothing, because already save to Recorder
+ }
+ }
+
+ log.info('Start to run single scripts')
+ futures.clear()
+ scriptSources.eachWithIndex { source, i ->
+// log.info("Prepare scripts [${i + 1}/${totalFile}]".toString())
+ def future = scriptExecutors.submit {
+ runScript(config, source, recorder, true)
}
futures.add(future)
}
@@ -192,8 +227,9 @@ class RegressionTest {
{ fileName -> fileName.substring(0,
fileName.lastIndexOf(".")) == "load" })
}
log.info('Start to run scripts')
- runScripts(config, recorder, directoryFilter,
+ runScripts(config, recorder, directoryFilter,
{ fileName -> fileName.substring(0, fileName.lastIndexOf("."))
!= "load" })
+
return recorder
}
@@ -228,7 +264,18 @@ class RegressionTest {
return true
}
- static boolean canRun(Config config, String suiteName, String group) {
+ static boolean canRun(Config config, String suiteName, String group,
boolean isSingleThreadScript) {
+ Set<String> suiteGroups = group.split(',').collect { g -> g.trim()
}.toSet();
+ if (isSingleThreadScript) {
+ if (!suiteGroups.contains(nonConcurrentTestGroup)) {
+ return false
+ }
+ } else {
+ if (suiteGroups.contains(nonConcurrentTestGroup)) {
+ return false
+ }
+ }
+
return filterGroups(config, group) && filterSuites(config, suiteName)
}
diff --git a/regression-test/pipeline/p0/conf/regression-conf.groovy
b/regression-test/pipeline/p0/conf/regression-conf.groovy
index 364a7103fe8..67e014f63a6 100644
--- a/regression-test/pipeline/p0/conf/regression-conf.groovy
+++ b/regression-test/pipeline/p0/conf/regression-conf.groovy
@@ -55,7 +55,7 @@ testDirectories = ""
excludeGroups = ""
// this suites will not be executed
-excludeSuites =
"test_sql_block_rule,test_profile,test_spark_load,test_refresh_mtmv,test_bitmap_filter,test_jdbc_query_mysql"
+excludeSuites =
"test_profile,test_spark_load,test_refresh_mtmv,test_bitmap_filter,test_jdbc_query_mysql"
// this directories will not be executed
excludeDirectories = "workload_manager_p1,fault_injection_p0"
diff --git a/regression-test/pipeline/p1/conf/regression-conf.groovy
b/regression-test/pipeline/p1/conf/regression-conf.groovy
index c7040561d5c..b7eec21a41f 100644
--- a/regression-test/pipeline/p1/conf/regression-conf.groovy
+++ b/regression-test/pipeline/p1/conf/regression-conf.groovy
@@ -49,7 +49,7 @@ testSuites = ""
// this suites will not be executed
excludeSuites =
"test_big_pad,test_profile,test_broker_load,test_spark_load,test_analyze_stats_p1,test_refresh_mtmv,test_bitmap_filter"
// this dir will not be executed
-excludeDirectories = "workload_manager_p1"
+excludeDirectories = "workload_manager_p1,fault_injection_p0"
cacheDataPath="/data/regression/"
s3Endpoint = "cos.ap-hongkong.myqcloud.com"
diff --git
a/regression-test/suites/fault_injection_p0/test_index_fault_injection.groovy
b/regression-test/suites/fault_injection_p0/test_index_fault_injection.groovy
index 93860b46bbc..b3f6c24d60a 100644
---
a/regression-test/suites/fault_injection_p0/test_index_fault_injection.groovy
+++
b/regression-test/suites/fault_injection_p0/test_index_fault_injection.groovy
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-suite("test_index_failure_injection", "p0") {
+suite("test_index_failure_injection", "p0", "nonConcurrent") {
// define a sql table
def testTable_dup = "httplogs_dup"
def testTable_unique = "httplogs_unique"
diff --git
a/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy
b/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy
index 2f601f13d11..a4ded1a58e0 100644
---
a/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy
+++
b/regression-test/suites/fault_injection_p0/test_segcompaction_fault_injection.groovy
@@ -37,7 +37,7 @@ def create_table_sql = """
"""
def columns = "col_0, col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8,
col_9, col_10, col_11, col_12, col_13, col_14, col_15, col_16, col_17, col_18,
col_19, col_20, col_21, col_22, col_23, col_24, col_25, col_26, col_27, col_28,
col_29, col_30, col_31, col_32, col_33, col_34, col_35, col_36, col_37, col_38,
col_39, col_40, col_41, col_42, col_43, col_44, col_45, col_46, col_47, col_48,
col_49"
-suite("test_segcompaction_correctness") {
+suite("test_segcompaction_correctness", "nonConcurrent") {
def runLoadWithSegcompaction = {
String ak = getS3AK()
String sk = getS3SK()
diff --git
a/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy
b/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy
index b68e324ee98..de7bcac5f10 100644
---
a/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy
+++
b/regression-test/suites/fault_injection_p0/test_too_many_segments_fault_injection.groovy
@@ -37,7 +37,7 @@ def create_table_sql = """
"""
def columns = "col_0, col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8,
col_9, col_10, col_11, col_12, col_13, col_14, col_15, col_16, col_17, col_18,
col_19, col_20, col_21, col_22, col_23, col_24, col_25, col_26, col_27, col_28,
col_29, col_30, col_31, col_32, col_33, col_34, col_35, col_36, col_37, col_38,
col_39, col_40, col_41, col_42, col_43, col_44, col_45, col_46, col_47, col_48,
col_49"
-suite("test_too_many_segments") { // the epic -238 case
+suite("test_too_many_segments", "nonConcurrent") { // the epic -238 case
def runLoadWithTooManySegments = {
String ak = getS3AK()
String sk = getS3SK()
diff --git
a/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy
b/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy
index bc5597dd5a9..53ea9a87d4e 100644
--- a/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy
+++ b/regression-test/suites/sql_block_rule_p0/test_sql_block_rule.groovy
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-suite("test_sql_block_rule") {
+suite("test_sql_block_rule", "nonConcurrent") {
sql """
DROP SQL_BLOCK_RULE if exists test_rule_partition
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]