This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new ed8531b99ad branch-2.1: [feat](regression) inject debug points need 
run in nonConcurrent or docker suites #49581 (#49618)
ed8531b99ad is described below

commit ed8531b99ade11ef612e2bae16e926687c5637c7
Author: yujun <yu...@selectdb.com>
AuthorDate: Sun Mar 30 15:43:58 2025 +0800

    branch-2.1: [feat](regression) inject debug points need run in 
nonConcurrent or docker suites #49581 (#49618)
    
    Cherry-picked from #49581, #40259
---
 .../org/apache/doris/regression/Config.groovy      |  7 ++
 .../apache/doris/regression/ConfigOptions.groovy   | 10 +++
 .../apache/doris/regression/RegressionTest.groovy  | 83 +++++++++++++++-------
 .../org/apache/doris/regression/suite/Suite.groovy | 13 ++++
 .../backup_restore/test_backup_cancelled.groovy    | 45 ++++++------
 .../test_backup_restore_atomic_with_alter.groovy   |  6 +-
 .../clone_p0/test_clone_no_missing_version.groovy  |  2 +-
 .../suites/clone_p0/test_decommission_mtmv.groovy  |  2 +-
 .../test_drop_clone_tablet_path_race.groovy        |  5 +-
 .../test_compaction_with_visible_version.groovy    |  2 +-
 .../suites/demo_p0/debugpoint_action.groovy        | 26 +++++++
 .../suites/demo_p0/docker_action.groovy            |  2 +-
 .../test_partial_update_during_sc.groovy           |  2 +-
 .../group_commit/replay_wal_restart_fe.groovy      |  2 +-
 .../test_build_index_with_clone_by_docker.groovy   |  5 +-
 .../test_min_load_replica_num_complicate.groovy    |  2 +-
 .../load/insert/test_publish_one_succ.groovy       |  2 +-
 .../insert/test_min_load_replica_num_simple.groovy |  2 +-
 .../stream_load/test_coordidator_be_restart.groovy |  2 +-
 .../test_migrate_disk_with_publish_version.groovy  |  5 +-
 .../test_create_table_exception.groovy             |  2 +-
 .../test_partition_create_tablet_rr.groovy         |  2 +-
 .../test_inject_send_filter_size_fail.groovy       |  2 +-
 .../join/test_slow_close/test_slow_close.groovy    |  2 +-
 .../suites/query_p0/test_forward_qeury.groovy      |  4 +-
 .../test_schema_change_concurrent_with_txn.groovy  |  2 +-
 .../test_partition_default_medium.groovy           |  2 +-
 .../test_storage_medium_has_disk.groovy            |  6 +-
 regression-test/suites/trash_p0/clean_trash.groovy |  7 +-
 .../test_partial_update_conflict_be_restart.groovy |  2 +-
 .../test_mow_full_clone_exception.groovy           |  2 +-
 run-regression-test.sh                             |  1 +
 32 files changed, 183 insertions(+), 76 deletions(-)

diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy
index c1395b6d4c0..acd7076ab1b 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/Config.groovy
@@ -108,6 +108,7 @@ class Config {
     public InetSocketAddress metaServiceHttpInetSocketAddress
     public Integer parallel
     public Integer suiteParallel
+    public Integer dockerSuiteParallel
     public Integer actionParallel
     public Integer times
     public boolean withOutLoadData
@@ -279,6 +280,7 @@ class Config {
         config.forceGenerateOutputFile = cmd.hasOption(forceGenOutOpt)
         config.parallel = Integer.parseInt(cmd.getOptionValue(parallelOpt, 
"10"))
         config.suiteParallel = 
Integer.parseInt(cmd.getOptionValue(suiteParallelOpt, "10"))
+        config.dockerSuiteParallel = 
Integer.parseInt(cmd.getOptionValue(dockerSuiteParallelOpt, "1"))
         config.actionParallel = 
Integer.parseInt(cmd.getOptionValue(actionParallelOpt, "10"))
         config.times = Integer.parseInt(cmd.getOptionValue(timesOpt, "1"))
         config.randomOrder = cmd.hasOption(randomOrderOpt)
@@ -606,6 +608,11 @@ class Config {
             log.info("Set suiteParallel to 1 because not specify.".toString())
         }
 
+        if (config.dockerSuiteParallel == null) {
+            config.dockerSuiteParallel = 1
+            log.info("Set dockerSuiteParallel to 1 because not 
specify.".toString())
+        }
+
         if (config.actionParallel == null) {
             config.actionParallel = 10
             log.info("Set actionParallel to 10 because not 
specify.".toString())
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/ConfigOptions.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/ConfigOptions.groovy
index 69b21457d2f..2269e3690f4 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/ConfigOptions.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/ConfigOptions.groovy
@@ -61,6 +61,7 @@ class ConfigOptions {
     static Option forceGenOutOpt
     static Option parallelOpt
     static Option suiteParallelOpt
+    static Option dockerSuiteParallelOpt
     static Option actionParallelOpt
     static Option randomOrderOpt
     static Option stopWhenFailOpt
@@ -352,6 +353,14 @@ class ConfigOptions {
                 .longOpt("suiteParallel")
                 .desc("the num of threads running for suites")
                 .build()
+        dockerSuiteParallelOpt = Option.builder("dockerSuiteParallel")
+                .argName("dockerSuiteParallel")
+                .required(false)
+                .hasArg(true)
+                .type(String.class)
+                .longOpt("dockerSuiteParallel")
+                .desc("the num of threads running for docker suites")
+                .build()
         actionParallelOpt = Option.builder("actionParallel")
                 .argName("parallel")
                 .required(false)
@@ -435,6 +444,7 @@ class ConfigOptions {
                 .addOption(forceGenOutOpt)
                 .addOption(parallelOpt)
                 .addOption(suiteParallelOpt)
+                .addOption(dockerSuiteParallelOpt)
                 .addOption(actionParallelOpt)
                 .addOption(randomOrderOpt)
                 .addOption(stopWhenFailOpt)
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 d654fb8e5f5..15a62ac9ac4 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
@@ -52,16 +52,22 @@ import java.util.function.Predicate
 @CompileStatic
 class RegressionTest {
 
+    static enum GroupExecType {
+        NORMAL,
+        SINGLE,  // group contains nonConcurrent
+        DOCKER,  // group contains docker
+    }
+
     static ClassLoader classloader
     static CompilerConfiguration compileConfig
     static GroovyShell shell
     static ExecutorService scriptExecutors
-    static ExecutorService suiteExecutors
-    static ExecutorService singleSuiteExecutors
     static ExecutorService actionExecutors
+    static Map<GroupExecType, ExecutorService> suiteExecutors
     static ThreadLocal<Integer> threadLoadedClassNum = new ThreadLocal<>()
     static final int cleanLoadedClassesThreshold = 20
     static String nonConcurrentTestGroup = "nonConcurrent"
+    static String dockerTestGroup = "docker"
 
     static {
         ch.qos.logback.classic.Logger loggerOfSuite =
@@ -113,8 +119,9 @@ class RegressionTest {
             }
         }
         actionExecutors.shutdown()
-        suiteExecutors.shutdown()
-        singleSuiteExecutors.shutdown()
+        for (ExecutorService suiteExecutor : suiteExecutors.values()) {
+            suiteExecutor.shutdown()
+        }
         scriptExecutors.shutdown()
         log.info("Test finished")
         if (!success) {
@@ -135,17 +142,24 @@ class RegressionTest {
             .build();
         scriptExecutors = Executors.newFixedThreadPool(config.parallel, 
scriptFactory)
 
+        suiteExecutors = [:]
         BasicThreadFactory suiteFactory = new BasicThreadFactory.Builder()
             .namingPattern("suite-thread-%d")
             .priority(Thread.MAX_PRIORITY)
             .build();
-        suiteExecutors = Executors.newFixedThreadPool(config.suiteParallel, 
suiteFactory)
+        suiteExecutors[GroupExecType.NORMAL] = 
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)
+        suiteExecutors[GroupExecType.SINGLE] = Executors.newFixedThreadPool(1, 
singleSuiteFactory)
+
+        BasicThreadFactory dockerSuiteFactory = new 
BasicThreadFactory.Builder()
+            .namingPattern("docker-suite-thread-%d")
+            .priority(Thread.MAX_PRIORITY)
+            .build();
+        suiteExecutors[GroupExecType.DOCKER] = 
Executors.newFixedThreadPool(config.dockerSuiteParallel, dockerSuiteFactory)
 
         BasicThreadFactory actionFactory = new BasicThreadFactory.Builder()
             .namingPattern("action-thread-%d")
@@ -183,9 +197,9 @@ class RegressionTest {
         return sources
     }
 
-    static void runScript(Config config, ScriptSource source, Recorder 
recorder, boolean isSingleThreadScript) {
+    static void runScript(Config config, ScriptSource source, Recorder 
recorder, GroupExecType grpExecType) {
         def suiteFilter = { String suiteName, String groupName ->
-            canRun(config, suiteName, groupName, isSingleThreadScript)
+            canRun(config, suiteName, groupName, grpExecType)
         }
         def file = source.getFile()
         int failureLimit = 
Integer.valueOf(config.otherConfigs.getOrDefault("max_failure_num", 
"-1").toString());
@@ -196,12 +210,7 @@ class RegressionTest {
             return;
         }
         def eventListeners = getEventListeners(config, recorder)
-        ExecutorService executors = null
-        if (isSingleThreadScript) {
-            executors = singleSuiteExecutors
-        } else {
-            executors = suiteExecutors
-        }
+        ExecutorService executors = suiteExecutors[grpExecType]
 
         new ScriptContext(file, executors, actionExecutors,
                 config, eventListeners, suiteFilter).start { scriptContext ->
@@ -227,11 +236,20 @@ class RegressionTest {
         scriptSources.eachWithIndex { source, i ->
 //            log.info("Prepare scripts [${i + 1}/${totalFile}]".toString())
             def future = scriptExecutors.submit {
-                runScript(config, source, recorder, false)
+                runScript(config, source, recorder, GroupExecType.NORMAL)
             }
             futures.add(future)
         }
 
+        List<Future> dockerFutures = Lists.newArrayList()
+        scriptSources.eachWithIndex { source, i ->
+//            log.info("Prepare scripts [${i + 1}/${totalFile}]".toString())
+            def future = scriptExecutors.submit {
+                runScript(config, source, recorder, GroupExecType.DOCKER)
+            }
+            dockerFutures.add(future)
+        }
+
         // wait all scripts
         for (Future future : futures) {
             try {
@@ -250,12 +268,20 @@ class RegressionTest {
         scriptSources.eachWithIndex { source, i ->
 //            log.info("Prepare scripts [${i + 1}/${totalFile}]".toString())
             def future = scriptExecutors.submit {
-                runScript(config, source, recorder, true)
+                runScript(config, source, recorder, GroupExecType.SINGLE)
             }
             futures.add(future)
         }
 
         // wait all scripts
+        for (Future future : dockerFutures) {
+            try {
+                future.get()
+            } catch (Throwable t) {
+                // do nothing, because already save to Recorder
+            }
+        }
+
         for (Future future : futures) {
             try {
                 future.get()
@@ -311,19 +337,19 @@ class RegressionTest {
         return true
     }
 
-    static boolean canRun(Config config, String suiteName, String group, 
boolean isSingleThreadScript) {
+    static boolean canRun(Config config, String suiteName, String group, 
GroupExecType grpExecType) {
+        return getGroupExecType(group) == grpExecType && filterGroups(config, 
group) && filterSuites(config, suiteName)
+    }
+
+    static GroupExecType getGroupExecType(String group) {
         Set<String> suiteGroups = group.split(',').collect { g -> g.trim() 
}.toSet();
-        if (isSingleThreadScript) {
-            if (!suiteGroups.contains(nonConcurrentTestGroup)) {
-                return false
-            }
+        if (suiteGroups.contains(nonConcurrentTestGroup)) {
+            return GroupExecType.SINGLE
+        } else if (suiteGroups.contains(dockerTestGroup)) {
+            return GroupExecType.DOCKER
         } else {
-            if (suiteGroups.contains(nonConcurrentTestGroup)) {
-                return false
-            }
+            return GroupExecType.NORMAL
         }
-
-        return filterGroups(config, group) && filterSuites(config, suiteName)
     }
 
     static List<EventListener> getEventListeners(Config config, Recorder 
recorder) {
@@ -409,7 +435,7 @@ class RegressionTest {
         }
         pluginPath.eachFileRecurse({ it ->
             if (it.name.endsWith(".groovy")) {
-                ScriptContext context = new ScriptContext(it, suiteExecutors, 
actionExecutors,
+                ScriptContext context = new ScriptContext(it, 
suiteExecutors[GroupExecType.NORMAL], actionExecutors,
                         config, [], { name -> true })
                 File pluginFile = it
                 context.start({
@@ -441,6 +467,9 @@ class RegressionTest {
             log.warn("install doris compose requirements failed: 
code=${proc.exitValue()}, "
                     + "output: ${sout.toString()}, error: ${serr.toString()}")
         }
+
+        def pipList = 'python -m pip list'.execute().text
+        log.info("python library: ${pipList}")
     }
 
     static void printPassed() {
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
index ded07e898ad..5ef70a961e1 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
@@ -33,6 +33,7 @@ import groovy.json.JsonSlurper
 import com.google.common.collect.ImmutableList
 import org.apache.commons.lang3.ObjectUtils
 import org.apache.doris.regression.Config
+import org.apache.doris.regression.RegressionTest
 import org.apache.doris.regression.action.BenchmarkAction
 import org.apache.doris.regression.action.ProfileAction
 import org.apache.doris.regression.action.WaitForAction
@@ -264,6 +265,11 @@ class Suite implements GroovyInterceptable {
             return
         }
 
+        if (RegressionTest.getGroupExecType(group) != 
RegressionTest.GroupExecType.DOCKER) {
+            throw new Exception("Need to add 'docker' to docker suite's belong 
groups, "
+                    + "see example demo_p0/docker_action.groovy")
+        }
+
         boolean pipelineIsCloud = isCloudMode()
         boolean dockerIsCloud = false
         if (options.cloudMode == null) {
@@ -1398,6 +1404,13 @@ class Suite implements GroovyInterceptable {
     }
 
     DebugPoint GetDebugPoint() {
+        def execType = RegressionTest.getGroupExecType(group);
+        if (execType != RegressionTest.GroupExecType.SINGLE
+            && execType != RegressionTest.GroupExecType.DOCKER) {
+            throw new Exception("Debug point must use in nonConcurrent suite 
or docker suite, "
+                    + "need add 'nonConcurrent' or 'docker' to suite's belong 
groups, "
+                    + "see example demo_p0/debugpoint_action.groovy.")
+        }
         return debugPoint
     }
 
diff --git a/regression-test/suites/backup_restore/test_backup_cancelled.groovy 
b/regression-test/suites/backup_restore/test_backup_cancelled.groovy
index ef95d870d18..4e021fa6524 100644
--- a/regression-test/suites/backup_restore/test_backup_cancelled.groovy
+++ b/regression-test/suites/backup_restore/test_backup_cancelled.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_backup_cancelled", "backup_cancelled") {
+suite("test_backup_cancelled", "backup_cancelled,nonConcurrent") {
     String suiteName = "test_backup_cancelled"
     String repoName = "${suiteName}_repo_" + 
UUID.randomUUID().toString().replace("-", "")
     String dbName = "${suiteName}_db"
@@ -58,36 +58,37 @@ suite("test_backup_cancelled", "backup_cancelled") {
 
     // test failed to get tablet when truncate or drop table
 
-    
GetDebugPoint().enableDebugPointForAllBEs("SnapshotManager::make_snapshot.inject_failure",
 [tablet_id:"${tabletId}", execute:3]);
-
-
-    sql """
-        BACKUP SNAPSHOT ${dbName}.${snapshotName}
-        TO `${repoName}`
-        ON (${tableName})
-    """
-
-    syncer.waitSnapshotFinish(dbName)
+    try {
+        
GetDebugPoint().enableDebugPointForAllBEs("SnapshotManager::make_snapshot.inject_failure",
 [tablet_id:"${tabletId}", execute:3]);
 
+        sql """
+            BACKUP SNAPSHOT ${dbName}.${snapshotName}
+            TO `${repoName}`
+            ON (${tableName})
+        """
 
-    
GetDebugPoint().disableDebugPointForAllBEs("SnapshotManager::make_snapshot.inject_failure")
+        syncer.waitSnapshotFinish(dbName)
+    } finally {
+        
GetDebugPoint().disableDebugPointForAllBEs("SnapshotManager::make_snapshot.inject_failure")
+    }
 
 
 
 
     // test missing versions when compaction or balance
+    try {
+        
GetDebugPoint().enableDebugPointForAllBEs("Tablet::capture_consistent_versions.inject_failure",
 [tablet_id:"${tabletId}", execute:1]);
 
-    
GetDebugPoint().enableDebugPointForAllBEs("Tablet::capture_consistent_versions.inject_failure",
 [tablet_id:"${tabletId}", execute:1]);
-
-    sql """
-        BACKUP SNAPSHOT ${dbName}.${snapshotName_1}
-        TO `${repoName}`
-        ON (${tableName})
-    """
-
-    syncer.waitSnapshotFinish(dbName)
+        sql """
+            BACKUP SNAPSHOT ${dbName}.${snapshotName_1}
+            TO `${repoName}`
+            ON (${tableName})
+        """
 
-    
GetDebugPoint().disableDebugPointForAllBEs("Tablet::capture_consistent_versions.inject_failure");
+        syncer.waitSnapshotFinish(dbName)
+    } finally {
+        
GetDebugPoint().disableDebugPointForAllBEs("Tablet::capture_consistent_versions.inject_failure");
+    }
 
 
     def snapshot = syncer.getSnapshotTimestamp(repoName, snapshotName)
diff --git 
a/regression-test/suites/backup_restore/test_backup_restore_atomic_with_alter.groovy
 
b/regression-test/suites/backup_restore/test_backup_restore_atomic_with_alter.groovy
index 2754e5f8af6..4c835f02ef5 100644
--- 
a/regression-test/suites/backup_restore/test_backup_restore_atomic_with_alter.groovy
+++ 
b/regression-test/suites/backup_restore/test_backup_restore_atomic_with_alter.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_backup_restore_atomic_with_alter", "backup_restore") {
+suite("test_backup_restore_atomic_with_alter", "backup_restore,nonConcurrent") 
{
     if (!getFeConfig("enable_debug_points").equals("true")) {
         logger.info("Config.enable_debug_points=true is required")
         return
@@ -96,6 +96,7 @@ suite("test_backup_restore_atomic_with_alter", 
"backup_restore") {
     sql "DROP TABLE ${dbName}.${tableNamePrefix}_0 FORCE"
 
     // disable restore
+ try {
     
GetDebugPoint().enableDebugPointForAllFEs("FE.PAUSE_NON_PENDING_RESTORE_JOB", 
[value:snapshotName])
 
     sql """
@@ -239,6 +240,9 @@ suite("test_backup_restore_atomic_with_alter", 
"backup_restore") {
     }
     sql "DROP DATABASE ${dbName} FORCE"
     sql "DROP REPOSITORY `${repoName}`"
+  } finally {
+    
GetDebugPoint().disableDebugPointForAllFEs("FE.PAUSE_NON_PENDING_RESTORE_JOB")
+  }
 }
 
 
diff --git 
a/regression-test/suites/clone_p0/test_clone_no_missing_version.groovy 
b/regression-test/suites/clone_p0/test_clone_no_missing_version.groovy
index 75eb3866ec8..b19521441dd 100644
--- a/regression-test/suites/clone_p0/test_clone_no_missing_version.groovy
+++ b/regression-test/suites/clone_p0/test_clone_no_missing_version.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite('test_clone_no_missing_version') {
+suite('test_clone_no_missing_version', 'docker') {
     def tbl = 'tbl_test_clone_no_missing_version'
     def options = new ClusterOptions()
     options.feConfigs += [
diff --git a/regression-test/suites/clone_p0/test_decommission_mtmv.groovy 
b/regression-test/suites/clone_p0/test_decommission_mtmv.groovy
index 24853aa718c..b29d5c13c94 100644
--- a/regression-test/suites/clone_p0/test_decommission_mtmv.groovy
+++ b/regression-test/suites/clone_p0/test_decommission_mtmv.groovy
@@ -17,7 +17,7 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite('test_decommission_mtmv') {
+suite('test_decommission_mtmv', 'docker') {
     def options = new ClusterOptions()
     options.feConfigs += [
         'disable_balance=true',
diff --git 
a/regression-test/suites/clone_p0/test_drop_clone_tablet_path_race.groovy 
b/regression-test/suites/clone_p0/test_drop_clone_tablet_path_race.groovy
index 0c024dc8792..f9c72f3b71c 100644
--- a/regression-test/suites/clone_p0/test_drop_clone_tablet_path_race.groovy
+++ b/regression-test/suites/clone_p0/test_drop_clone_tablet_path_race.groovy
@@ -18,7 +18,10 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.junit.Assert
 
-suite('test_drop_clone_tablet_path_race') {
+suite('test_drop_clone_tablet_path_race', 'docker') {
+    if (isCloudMode()) {
+        return
+    }
     def options = new ClusterOptions()
     options.enableDebugPoints()
     options.feConfigs += [
diff --git 
a/regression-test/suites/compaction/test_compaction_with_visible_version.groovy 
b/regression-test/suites/compaction/test_compaction_with_visible_version.groovy
index a8ed6e1e69d..ddf80e09642 100644
--- 
a/regression-test/suites/compaction/test_compaction_with_visible_version.groovy
+++ 
b/regression-test/suites/compaction/test_compaction_with_visible_version.groovy
@@ -19,7 +19,7 @@ import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.Http
 import org.apache.doris.regression.util.NodeType
 
-suite('test_compaction_with_visible_version') {
+suite('test_compaction_with_visible_version', 'docker') {
     def options = new ClusterOptions()
     def compaction_keep_invisible_version_min_count = 50L
     options.feConfigs += [
diff --git a/regression-test/suites/demo_p0/debugpoint_action.groovy 
b/regression-test/suites/demo_p0/debugpoint_action.groovy
index 78355b9c5ed..9ad71a8345f 100644
--- a/regression-test/suites/demo_p0/debugpoint_action.groovy
+++ b/regression-test/suites/demo_p0/debugpoint_action.groovy
@@ -15,6 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
+import org.junit.Assert
+
+// This is a good example.
+// Debug point must run in 'nonConcurrent' or 'docker' suites.
+// If not a docker suite, must put nonConcurrent to the groups.
 suite('debugpoint_action', 'nonConcurrent') {
     try {
         
GetDebugPoint().enableDebugPointForAllFEs('PublishVersionDaemon.stop_publish', 
[timeout:1])
@@ -25,3 +30,24 @@ suite('debugpoint_action', 'nonConcurrent') {
         
GetDebugPoint().disableDebugPointForAllBEs('Tablet.build_tablet_report_info.version_miss')
     }
 }
+
+// This is a bad example.
+// its group tag not contains nonConcurrent or docker.
+suite('debugpoint_action_bad') {
+    Exception exception = null;
+    try {
+        GetDebugPoint().enableDebugPointForAllFEs('debugpoint_action_bad_xx', 
[timeout:1])
+    } catch (Exception e) {
+        exception = e
+    } finally {
+        // this is bad example, should disable or clear debug points after end 
suite
+        // 
GetDebugPoint().disableDebugPointForAllFEs('debugpoint_action_bad_xx')
+    }
+
+    Assert.assertNotNull(exception)
+    def expectMsg = "Debug point must use in nonConcurrent suite or docker 
suite"
+    def msg = exception.toString()
+    log.info("meet exception: ${msg}")
+    Assert.assertTrue("Expect exception msg contains '${expectMsg}', but meet 
'${msg}'",
+            msg.contains(expectMsg))
+}
diff --git a/regression-test/suites/demo_p0/docker_action.groovy 
b/regression-test/suites/demo_p0/docker_action.groovy
index d59c0f43774..6f293c4748a 100644
--- a/regression-test/suites/demo_p0/docker_action.groovy
+++ b/regression-test/suites/demo_p0/docker_action.groovy
@@ -17,7 +17,7 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite('docker_action') {
+suite('docker_action', 'docker') {
     // run a new docker
     docker {
         sql '''create table tb1 (k int) DISTRIBUTED BY HASH(k) BUCKETS 10'''
diff --git 
a/regression-test/suites/fault_injection_p0/partial_update/test_partial_update_during_sc.groovy
 
b/regression-test/suites/fault_injection_p0/partial_update/test_partial_update_during_sc.groovy
index 19ef81f781f..354d9557dde 100644
--- 
a/regression-test/suites/fault_injection_p0/partial_update/test_partial_update_during_sc.groovy
+++ 
b/regression-test/suites/fault_injection_p0/partial_update/test_partial_update_during_sc.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite('test_partial_update_during_sc') {
+suite('test_partial_update_during_sc', 'nonConcurrent') {
 
     String db = context.config.getDbNameByFile(context.file)
     sql "select 1;" // to create database
diff --git 
a/regression-test/suites/insert_p0/group_commit/replay_wal_restart_fe.groovy 
b/regression-test/suites/insert_p0/group_commit/replay_wal_restart_fe.groovy
index 0b84549586e..33664f52f2b 100644
--- a/regression-test/suites/insert_p0/group_commit/replay_wal_restart_fe.groovy
+++ b/regression-test/suites/insert_p0/group_commit/replay_wal_restart_fe.groovy
@@ -21,7 +21,7 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite("replay_wal_restart_fe") {
+suite("replay_wal_restart_fe", 'docker') {
     def check_schema_change = { state ->
         for (int i = 0; i < 30; i++) {
             def jobs = sql_return_maparray "SHOW ALTER TABLE COLUMN WHERE 
TableName = 'tbl_2' order by CreateTime desc;"
diff --git 
a/regression-test/suites/inverted_index_p0/index_change/test_build_index_with_clone_by_docker.groovy
 
b/regression-test/suites/inverted_index_p0/index_change/test_build_index_with_clone_by_docker.groovy
index 9d30ca30c0c..999b58350ff 100644
--- 
a/regression-test/suites/inverted_index_p0/index_change/test_build_index_with_clone_by_docker.groovy
+++ 
b/regression-test/suites/inverted_index_p0/index_change/test_build_index_with_clone_by_docker.groovy
@@ -19,7 +19,10 @@ import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 import org.apache.doris.regression.suite.SuiteCluster
 
-suite("test_build_index_with_clone_by_docker"){
+suite("test_build_index_with_clone_by_docker", 'docker'){
+    if (isCloudMode()) {
+        return 
+    }
     def timeout = 300000
     def delta_time = 1000
     def alter_res = "null"
diff --git 
a/regression-test/suites/load/insert/test_min_load_replica_num_complicate.groovy
 
b/regression-test/suites/load/insert/test_min_load_replica_num_complicate.groovy
index 10869ed9bf2..d6c9c71539b 100644
--- 
a/regression-test/suites/load/insert/test_min_load_replica_num_complicate.groovy
+++ 
b/regression-test/suites/load/insert/test_min_load_replica_num_complicate.groovy
@@ -34,7 +34,7 @@ class InjectCase {
 
 }
 
-suite('test_min_load_replica_num_complicate') {
+suite('test_min_load_replica_num_complicate', 'docker') {
     def beCloneCostMs = 3000
 
     def random = new Random()
diff --git a/regression-test/suites/load/insert/test_publish_one_succ.groovy 
b/regression-test/suites/load/insert/test_publish_one_succ.groovy
index 22f78c64300..f58bca5c458 100644
--- a/regression-test/suites/load/insert/test_publish_one_succ.groovy
+++ b/regression-test/suites/load/insert/test_publish_one_succ.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite('test_publish_one_succ') {
+suite('test_publish_one_succ', 'docker') {
     def options = new ClusterOptions()
     options.enableDebugPoints()
     docker(options) {
diff --git 
a/regression-test/suites/load_p0/insert/test_min_load_replica_num_simple.groovy 
b/regression-test/suites/load_p0/insert/test_min_load_replica_num_simple.groovy
index 75d7155c3d4..88bcbfd248e 100644
--- 
a/regression-test/suites/load_p0/insert/test_min_load_replica_num_simple.groovy
+++ 
b/regression-test/suites/load_p0/insert/test_min_load_replica_num_simple.groovy
@@ -17,7 +17,7 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite('test_min_load_replica_num_simple') {
+suite('test_min_load_replica_num_simple', 'docker') {
     def options = new ClusterOptions()
     options.feConfigs.add('tablet_checker_interval_ms=1000')
     docker(options) {
diff --git 
a/regression-test/suites/load_p0/stream_load/test_coordidator_be_restart.groovy 
b/regression-test/suites/load_p0/stream_load/test_coordidator_be_restart.groovy
index bb6b0c18a0d..e728335003a 100644
--- 
a/regression-test/suites/load_p0/stream_load/test_coordidator_be_restart.groovy
+++ 
b/regression-test/suites/load_p0/stream_load/test_coordidator_be_restart.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.http.NoHttpResponseException
 
-suite('test_coordidator_be_restart') {
+suite('test_coordidator_be_restart', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = false
     options.enableDebugPoints()
diff --git 
a/regression-test/suites/migrate_p0/test_migrate_disk_with_publish_version.groovy
 
b/regression-test/suites/migrate_p0/test_migrate_disk_with_publish_version.groovy
index e5b22b791af..61dac3e4141 100644
--- 
a/regression-test/suites/migrate_p0/test_migrate_disk_with_publish_version.groovy
+++ 
b/regression-test/suites/migrate_p0/test_migrate_disk_with_publish_version.groovy
@@ -18,7 +18,10 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite('test_migrate_disk_with_publish_version') {
+suite('test_migrate_disk_with_publish_version', 'docker') {
+    if (isCloudMode()) {
+        return
+    }
     def checkTabletOnHDD = { isOnHdd ->
         sleep 5000
 
diff --git 
a/regression-test/suites/partition_p0/test_create_table_exception.groovy 
b/regression-test/suites/partition_p0/test_create_table_exception.groovy
index 96f097c7670..7c96e4b59da 100644
--- a/regression-test/suites/partition_p0/test_create_table_exception.groovy
+++ b/regression-test/suites/partition_p0/test_create_table_exception.groovy
@@ -18,7 +18,7 @@ import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 import org.apache.doris.regression.suite.SuiteCluster
 
-suite("test_create_table_exception") {
+suite("test_create_table_exception", "docker") {
     def options = new ClusterOptions()
     options.enableDebugPoints()
     options.setFeNum(3)
diff --git 
a/regression-test/suites/partition_p0/test_partition_create_tablet_rr.groovy 
b/regression-test/suites/partition_p0/test_partition_create_tablet_rr.groovy
index f7e77f06f38..836dff938f8 100644
--- a/regression-test/suites/partition_p0/test_partition_create_tablet_rr.groovy
+++ b/regression-test/suites/partition_p0/test_partition_create_tablet_rr.groovy
@@ -18,7 +18,7 @@ import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 import org.apache.doris.regression.suite.SuiteCluster
 
-suite("test_partition_create_tablet_rr") {
+suite("test_partition_create_tablet_rr", "docker") {
     def options = new ClusterOptions()
     options.beNum = 1
     options.feConfigs.add('disable_balance=true')
diff --git 
a/regression-test/suites/query_p0/join/test_inject_send_filter_size_fail/test_inject_send_filter_size_fail.groovy
 
b/regression-test/suites/query_p0/join/test_inject_send_filter_size_fail/test_inject_send_filter_size_fail.groovy
index ad0325a61fe..8ab842ae7c1 100644
--- 
a/regression-test/suites/query_p0/join/test_inject_send_filter_size_fail/test_inject_send_filter_size_fail.groovy
+++ 
b/regression-test/suites/query_p0/join/test_inject_send_filter_size_fail/test_inject_send_filter_size_fail.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_inject_send_filter_size_fail") {
+suite("test_inject_send_filter_size_fail", "nonConcurrent") {
     sql "set parallel_pipeline_task_num=3"
     sql "set enable_runtime_filter_prune=false"
     sql "set enable_sync_runtime_filter_size=true"
diff --git 
a/regression-test/suites/query_p0/join/test_slow_close/test_slow_close.groovy 
b/regression-test/suites/query_p0/join/test_slow_close/test_slow_close.groovy
index 0b36d2da5ab..4ae5ee5370c 100644
--- 
a/regression-test/suites/query_p0/join/test_slow_close/test_slow_close.groovy
+++ 
b/regression-test/suites/query_p0/join/test_slow_close/test_slow_close.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_slow_close") {
+suite("test_slow_close", "nonConcurrent") {
     sql "set disable_join_reorder=true;"
     sql "set runtime_filter_type='bloom_filter';"
     sql "set parallel_pipeline_task_num=3"
diff --git a/regression-test/suites/query_p0/test_forward_qeury.groovy 
b/regression-test/suites/query_p0/test_forward_qeury.groovy
index 563c2ded4aa..d4761c835a2 100644
--- a/regression-test/suites/query_p0/test_forward_qeury.groovy
+++ b/regression-test/suites/query_p0/test_forward_qeury.groovy
@@ -19,7 +19,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite("test_forward_query") {
+suite("test_forward_query", 'docker') {
     def options = new ClusterOptions()
     options.enableDebugPoints()
     options.setFeNum(2)
@@ -46,4 +46,4 @@ suite("test_forward_query") {
         def ret = sql """ SELECT * FROM ${tbl} """
         assertEquals(ret[0][0], 1)
     }
-}
\ No newline at end of file
+}
diff --git 
a/regression-test/suites/schema_change/test_schema_change_concurrent_with_txn.groovy
 
b/regression-test/suites/schema_change/test_schema_change_concurrent_with_txn.groovy
index d250a000c01..3a63e306ae1 100644
--- 
a/regression-test/suites/schema_change/test_schema_change_concurrent_with_txn.groovy
+++ 
b/regression-test/suites/schema_change/test_schema_change_concurrent_with_txn.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite('test_schema_change_concurrent_with_txn') {
+suite('test_schema_change_concurrent_with_txn', 'docker') {
     def options = new ClusterOptions()
     options.enableDebugPoints()
     options.feConfigs.add('publish_wait_time_second=-1')
diff --git 
a/regression-test/suites/storage_medium_p0/test_partition_default_medium.groovy 
b/regression-test/suites/storage_medium_p0/test_partition_default_medium.groovy
index 3543ce64ab1..163761833c2 100644
--- 
a/regression-test/suites/storage_medium_p0/test_partition_default_medium.groovy
+++ 
b/regression-test/suites/storage_medium_p0/test_partition_default_medium.groovy
@@ -18,7 +18,7 @@ import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 import org.apache.doris.regression.suite.SuiteCluster
 
-suite("test_partition_default_medium") {
+suite("test_partition_default_medium", 'docker') {
     def options = new ClusterOptions()
     options.feConfigs += [
         'default_storage_medium=HDD',
diff --git 
a/regression-test/suites/storage_medium_p0/test_storage_medium_has_disk.groovy 
b/regression-test/suites/storage_medium_p0/test_storage_medium_has_disk.groovy
index 9c90c89e57c..c252e10b130 100644
--- 
a/regression-test/suites/storage_medium_p0/test_storage_medium_has_disk.groovy
+++ 
b/regression-test/suites/storage_medium_p0/test_storage_medium_has_disk.groovy
@@ -17,7 +17,11 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite('test_storage_medium_has_disk') {
+suite('test_storage_medium_has_disk', 'docker') {
+    if (isCloudMode()) {
+        return
+    }
+
     def checkPartitionMedium = { table, isHdd ->
         def partitions = sql_return_maparray "SHOW PARTITIONS FROM ${table}"
         assertTrue(partitions.size() > 0)
diff --git a/regression-test/suites/trash_p0/clean_trash.groovy 
b/regression-test/suites/trash_p0/clean_trash.groovy
index 98e7e6d01e5..525e8054ce5 100644
--- a/regression-test/suites/trash_p0/clean_trash.groovy
+++ b/regression-test/suites/trash_p0/clean_trash.groovy
@@ -17,7 +17,10 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.junit.Assert
 
-suite("test_clean_trash", "p0") {
+suite("test_clean_trash", "docker") {
+    if (isCloudMode()) {
+        return
+    }
     def options = new ClusterOptions()
     options.enableDebugPoints()
     options.feConfigs += [
@@ -73,4 +76,4 @@ suite("test_clean_trash", "p0") {
         sql """admin clean trash"""
         checkFunc(true)
     }
-}
\ No newline at end of file
+}
diff --git 
a/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_conflict_be_restart.groovy
 
b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_conflict_be_restart.groovy
index bc2a44425b3..642363f9098 100644
--- 
a/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_conflict_be_restart.groovy
+++ 
b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_conflict_be_restart.groovy
@@ -35,7 +35,7 @@ import org.apache.http.client.methods.CloseableHttpResponse
 import org.apache.http.util.EntityUtils
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite("test_partial_update_conflict_be_restart") {
+suite("test_partial_update_conflict_be_restart", 'docker') {
     def dbName = context.config.getDbNameByFile(context.file)
 
     def options = new ClusterOptions()
diff --git 
a/regression-test/suites/unique_with_mow_p0/test_mow_full_clone_exception.groovy
 
b/regression-test/suites/unique_with_mow_p0/test_mow_full_clone_exception.groovy
index c3fb567f258..42befff4e54 100644
--- 
a/regression-test/suites/unique_with_mow_p0/test_mow_full_clone_exception.groovy
+++ 
b/regression-test/suites/unique_with_mow_p0/test_mow_full_clone_exception.groovy
@@ -29,7 +29,7 @@ import org.apache.doris.regression.util.NodeType
 //
 // the bug is fixed in #37001
 
-suite('test_full_clone_exception') {
+suite('test_full_clone_exception', 'docker') {
     def options = new ClusterOptions()
     options.feConfigs += [
         'disable_tablet_scheduler=true',
diff --git a/run-regression-test.sh b/run-regression-test.sh
index 588d28df449..118d5e81061 100755
--- a/run-regression-test.sh
+++ b/run-regression-test.sh
@@ -43,6 +43,7 @@ Usage: $0 <shell_options> <framework_options>
      -genOut                           generate .out file if not exist
      -forceGenOut                      delete and generate .out file
      -parallel                         run tests using specified threads
+     -dockerSuiteParallel              run docker tests using specified threads
      -randomOrder                      run tests in a random order
      -noKillDocker                     don't kill container when finish docker 
suites
      -times                            rum tests {times} times


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org


Reply via email to