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

dataroaring 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 42381995925 [feature](docker suite) Docker suite use independent 
executor (#40259)
42381995925 is described below

commit 42381995925748e107b895b758fc8fb34b840c71
Author: yujun <[email protected]>
AuthorDate: Wed Sep 11 00:07:43 2024 +0800

    [feature](docker suite) Docker suite use independent executor (#40259)
    
    If many docker suites run parallel, the docker containers take a lot
    memory, so use independent executor for them to control the memory
    usage.
    
    Use options or config dockerSuiteParallel to set the docker suite
    parallel, default is 1.
---
 docker/runtime/doris-compose/Readme.md             | 39 +++++++---
 docker/runtime/doris-compose/command.py            | 26 +++++++
 docker/runtime/doris-compose/resource/common.sh    |  2 +-
 .../org/apache/doris/regression/Config.groovy      |  7 ++
 .../apache/doris/regression/ConfigOptions.groovy   | 10 +++
 .../apache/doris/regression/RegressionTest.groovy  | 82 ++++++++++++++--------
 .../org/apache/doris/regression/suite/Suite.groovy |  6 ++
 .../doris/regression/suite/SuiteCluster.groovy     |  1 +
 .../clone_p0/test_clone_missing_version.groovy     |  2 +-
 .../clone_p0/test_clone_no_missing_version.groovy  |  2 +-
 .../suites/clone_p0/test_decommission_mtmv.groovy  |  2 +-
 .../test_drop_clone_tablet_path_race.groovy        |  2 +-
 .../cloud_p0/multi_cluster/test_rebalance.groovy   |  2 +-
 .../suites/cloud_p0/multi_cluster/test_tvf.groovy  |  4 +-
 .../cloud_p0/query_retry/test_retry_e-230.groovy   |  2 +-
 .../test_schema_change_with_compaction10.groovy    |  4 +-
 .../test_schema_change_with_compaction11.groovy    |  2 +-
 .../test_schema_change_with_compaction5.groovy     |  4 +-
 .../test_schema_change_with_compaction6.groovy     |  4 +-
 .../test_schema_change_with_compaction9.groovy     |  4 +-
 .../test_compaction_with_visible_version.groovy    |  2 +-
 .../suites/demo_p0/docker_action.groovy            | 10 ++-
 .../group_commit/replay_wal_restart_fe.groovy      |  2 +-
 .../transaction/txn_insert_restart_fe.groovy       |  2 +-
 ...txn_insert_restart_fe_with_schema_change.groovy |  2 +-
 .../test_build_index_with_clone_by_docker.groovy   |  2 +-
 .../test_min_load_replica_num_complicate.groovy    |  2 +-
 .../load/insert/test_publish_one_succ.groovy       |  2 +-
 .../load/insert/test_publish_slow_not_wait.groovy  |  2 +-
 .../insert/test_min_load_replica_num_simple.groovy |  2 +-
 .../test_routine_load_restart_fe.groovy            |  2 +-
 .../stream_load/test_coordidator_be_restart.groovy |  2 +-
 .../test_migrate_disk_with_publish_version.groovy  |  2 +-
 ...t_dynamic_partition_mod_distribution_key.groovy |  4 +-
 .../test_create_table_exception.groovy             |  2 +-
 .../test_partition_create_tablet_rr.groovy         |  2 +-
 .../suites/query_p0/test_forward_qeury.groovy      |  4 +-
 .../test_schema_change_concurrent_with_txn.groovy  |  2 +-
 .../test_abort_txn_by_be_cloud1.groovy             |  2 +-
 .../test_abort_txn_by_be_cloud2.groovy             |  2 +-
 .../test_abort_txn_by_be_local5.groovy             |  2 +-
 .../test_abort_txn_by_be_local6.groovy             |  2 +-
 .../test_abort_txn_by_fe_cloud4.groovy             |  2 +-
 .../test_abort_txn_by_fe_local3.groovy             |  2 +-
 .../test_partition_default_medium.groovy           |  2 +-
 .../test_storage_medium_has_disk.groovy            |  2 +-
 regression-test/suites/trash_p0/clean_trash.groovy |  4 +-
 .../test_mow_full_clone_exception.groovy           |  2 +-
 .../test_partial_update_conflict_be_restart.groovy |  2 +-
 .../test_mow_full_clone_exception.groovy           |  2 +-
 run-regression-test.sh                             |  1 +
 51 files changed, 195 insertions(+), 87 deletions(-)

diff --git a/docker/runtime/doris-compose/Readme.md 
b/docker/runtime/doris-compose/Readme.md
index a83fa81e761..770414f7a2b 100644
--- a/docker/runtime/doris-compose/Readme.md
+++ b/docker/runtime/doris-compose/Readme.md
@@ -23,7 +23,16 @@ Use doris compose to create doris docker compose clusters.
 
 ## Requirements
 
-1. The doris image should contains:
+##### 1. Make sure you have docker permissions
+
+ run:
+```
+docker run hello-world
+```
+
+if have problem with permission denied, then 
[add-docker-permission](https://docs.docker.com/engine/install/linux-postinstall/).
+
+##### 2. The doris image should contains
 
 ```
 /opt/apache-doris/{fe, be, cloud}
@@ -32,16 +41,14 @@ Use doris compose to create doris docker compose clusters.
 if don't create cloud cluster, the image no need to contains the cloud pkg.
 
 
-if build doris use `sh build.sh --fe --be --cloud`, then its output satisfy 
with all above, then run command in doris root
+if build doris use `sh build.sh --fe --be --cloud`, then its output satisfy 
with all above, then run command in doris root directory
+ will generate such a image.
 
 ```
 docker build -f docker/runtime/doris-compose/Dockerfile -t <image> .
 ```
 
-will generate a image.
-
-2. Install the dependent python library in 
'docker/runtime/doris-compose/requirements.txt'
-
+##### 3. Install the dependent python library in 
'docker/runtime/doris-compose/requirements.txt'
 
 ```
 python -m pip install --user -r docker/runtime/doris-compose/requirements.txt
@@ -49,6 +56,20 @@ python -m pip install --user -r 
docker/runtime/doris-compose/requirements.txt
 
 ## Usage
 
+### Notice
+
+Each cluster will have a directory in '/tmp/doris/{cluster-name}', user can 
set env LOCAL_DORIS_PATH to change its directory.
+
+For example, if user export LOCAL_DORIS_PATH=/mydoris, then the cluster's 
directory is '/mydoris/{cluster-name}'.
+
+And cluster's directory will contains all its containers's logs and data, like 
fe-1, fe-2, be-1, ..., etc.
+
+If there are multiple users run doris-compose on the same machine, suggest 
don't change LOCAL_DORIS_PATH or they should export the same LOCAL_DORIS_PATH.
+
+Because when create a new cluster, doris-compose will search the local doris 
path, and choose a docker network which is different with this path's clusters.
+
+So if multiple users use different LOCAL_DORIS_PATH, their clusters may have 
docker network conflict!!!
+
 ### Create a cluster or recreate its containers
 
 ```
@@ -65,9 +86,11 @@ add fe/be nodes with the specific image, or update existing 
nodes with `--fe-id`
 
 
 For create a cloud cluster, steps are as below:
+
 1. Write cloud s3 store config file, its default path is 
'/tmp/doris/cloud.ini'.
    It's defined in environment variable DORIS_CLOUD_CFG_FILE, user can change 
this env var to change its path.
    A Example file is locate in 
'docker/runtime/doris-compose/resource/cloud.ini.example'.
+
 2. Use doris compose up command with option '--cloud' to create a new cloud 
cluster.
 
 The simplest way to create a cloud cluster:
@@ -127,7 +150,7 @@ Generate regression-conf-custom.groovy to connect to the 
specific docker cluster
 
 steps:
 
-1. Create a new cluster:  `python doris-compose.py up my-cluster  my-image  
--add-fe-num 2  --add-be-num 4 --cloud`
-2. Generate regression-conf-custom.groovy: `python doris-compose.py config 
my-cluster  <doris-root-path> --connect-follow-fe`
+1. Create a new cluster:  `python 
docker/runtime/doris-compose/doris-compose.py up my-cluster  my-image  
--add-fe-num 2  --add-be-num 4 --cloud`
+2. Generate regression-conf-custom.groovy: `python 
docker/runtime/doris-compose/doris-compose.py config my-cluster  
<doris-root-path> --connect-follow-fe`
 3. Run regression test: `bash run-regression-test.sh --run -times 1 -parallel 
1 -suiteParallel 1 -d cloud/multi_cluster`
 
diff --git a/docker/runtime/doris-compose/command.py 
b/docker/runtime/doris-compose/command.py
index ed88dd03f4d..b6862bdcb00 100644
--- a/docker/runtime/doris-compose/command.py
+++ b/docker/runtime/doris-compose/command.py
@@ -826,7 +826,16 @@ cloudUniqueId= "{fe_cloud_unique_id}"
                 print("\nNo write regression custom file.")
                 return
 
+        annotation_start = "//---------- Start auto generate by 
doris-compose.py---------"
+        annotation_end = "//---------- End auto generate by 
doris-compose.py---------"
+
+        old_contents = []
+        if os.path.exists(regression_conf_custom):
+            with open(regression_conf_custom, "r") as f:
+                old_contents = f.readlines()
         with open(regression_conf_custom, "w") as f:
+            # write auto gen config
+            f.write(annotation_start)
             f.write(base_conf.format(fe_ip=fe_ip))
             if cluster.is_cloud:
                 multi_cluster_bes = ",".join([
@@ -845,6 +854,23 @@ cloudUniqueId= "{fe_cloud_unique_id}"
                         multi_cluster_bes=multi_cluster_bes,
                         fe_cloud_unique_id=cluster.get_node(
                             CLUSTER.Node.TYPE_FE, 1).cloud_unique_id()))
+            f.write(annotation_end + "\n\n")
+            annotation_end_line_count = -1
+
+            # write not-auto gen config
+            in_annotation = False
+            annotation_end_line_idx = -100
+            for line_idx, line in enumerate(old_contents):
+                line = line.rstrip()
+                if line == annotation_start:
+                    in_annotation = True
+                elif line == annotation_end:
+                    in_annotation = False
+                    annotation_end_line_idx = line_idx
+                elif not in_annotation:
+                    if line or line_idx != annotation_end_line_idx + 1:
+                        f.write(line + "\n")
+
         print("\nWrite succ: " + regression_conf_custom)
 
 
diff --git a/docker/runtime/doris-compose/resource/common.sh 
b/docker/runtime/doris-compose/resource/common.sh
index de6ba29865a..a1c1b3ff2a5 100644
--- a/docker/runtime/doris-compose/resource/common.sh
+++ b/docker/runtime/doris-compose/resource/common.sh
@@ -23,7 +23,7 @@ export LOG_FILE=$DORIS_HOME/log/health.out
 export LOCK_FILE=$DORIS_HOME/status/token
 
 health_log() {
-    echo "$(date +'%Y-%m-%d %H:%M:%S') $@" >>$LOG_FILE
+    echo "$(date +'%Y-%m-%d %H:%M:%S') $@" | tee -a $LOG_FILE
 }
 
 # concurrent write meta service server will failed due to fdb txn conflict.
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 53fd6b0415f..0042aa69a0a 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
@@ -117,6 +117,7 @@ class Config {
     public InetSocketAddress recycleServiceHttpInetSocketAddress
     public Integer parallel
     public Integer suiteParallel
+    public Integer dockerSuiteParallel
     public Integer actionParallel
     public Integer times
     public boolean withOutLoadData
@@ -467,6 +468,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)
@@ -888,6 +890,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 b1a782da94b..67322287d07 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
@@ -67,6 +67,7 @@ class ConfigOptions {
     static Option forceGenOutOpt
     static Option parallelOpt
     static Option suiteParallelOpt
+    static Option dockerSuiteParallelOpt
     static Option actionParallelOpt
     static Option randomOrderOpt
     static Option stopWhenFailOpt
@@ -425,6 +426,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)
@@ -607,6 +616,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 92e92a9b736..a0cc8ba2ea1 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")
@@ -198,9 +212,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());
@@ -211,12 +225,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 ->
@@ -242,11 +251,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 {
@@ -261,12 +279,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()
@@ -323,19 +349,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) {
@@ -421,7 +447,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({
@@ -454,7 +480,7 @@ class RegressionTest {
                     + "output: ${sout.toString()}, error: ${serr.toString()}")
         }
 
-        def pipList = 'pip list'.execute().text
+        def pipList = 'python -m pip list'.execute().text
         log.info("python library: ${pipList}")
     }
 
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 713a30e98ca..eb816ecb73f 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
@@ -29,6 +29,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
@@ -276,6 +277,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) {
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
index 44220500d1b..a2f99868bd7 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
@@ -40,6 +40,7 @@ class ClusterOptions {
     ]
 
     List<String> beConfigs = [
+        'max_sys_mem_available_low_water_mark_bytes=0', //no check mem 
available memory
         'report_disk_state_interval_seconds=2',
         'report_random_wait=false',
     ]
diff --git a/regression-test/suites/clone_p0/test_clone_missing_version.groovy 
b/regression-test/suites/clone_p0/test_clone_missing_version.groovy
index 2981cf3c5e3..aa119158dfa 100644
--- a/regression-test/suites/clone_p0/test_clone_missing_version.groovy
+++ b/regression-test/suites/clone_p0/test_clone_missing_version.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite('test_clone_missing_version') {
+suite('test_clone_missing_version', 'docker') {
     def options = new ClusterOptions()
     options.feConfigs += [
         'disable_tablet_scheduler=true',
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 ebf1259a72f..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,7 @@
 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
     }
diff --git 
a/regression-test/suites/cloud_p0/multi_cluster/test_rebalance.groovy 
b/regression-test/suites/cloud_p0/multi_cluster/test_rebalance.groovy
index 0aa2e83ccc2..542f9a969f5 100644
--- a/regression-test/suites/cloud_p0/multi_cluster/test_rebalance.groovy
+++ b/regression-test/suites/cloud_p0/multi_cluster/test_rebalance.groovy
@@ -20,7 +20,7 @@ import groovy.json.JsonSlurper
 import org.awaitility.Awaitility;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
-suite('test_rebalance_in_cloud', 'multi_cluster') {
+suite('test_rebalance_in_cloud', 'multi_cluster,docker') {
     if (!isCloudMode()) {
         return;
     }
diff --git a/regression-test/suites/cloud_p0/multi_cluster/test_tvf.groovy 
b/regression-test/suites/cloud_p0/multi_cluster/test_tvf.groovy
index 13af1209e99..90fd6656b8f 100644
--- a/regression-test/suites/cloud_p0/multi_cluster/test_tvf.groovy
+++ b/regression-test/suites/cloud_p0/multi_cluster/test_tvf.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import groovy.json.JsonSlurper
 
-suite('test_tvf_in_cloud', 'multi_cluster') {
+suite('test_tvf_in_cloud', 'multi_cluster,docker') {
     if (!isCloudMode()) {
         return;
     }
@@ -83,4 +83,4 @@ suite('test_tvf_in_cloud', 'multi_cluster') {
         sql """use @${currentCluster.cluster}"""
         testCase.call()
     }
-}
\ No newline at end of file
+}
diff --git 
a/regression-test/suites/cloud_p0/query_retry/test_retry_e-230.groovy 
b/regression-test/suites/cloud_p0/query_retry/test_retry_e-230.groovy
index 2d8ca3f5296..88ec8e8861d 100644
--- a/regression-test/suites/cloud_p0/query_retry/test_retry_e-230.groovy
+++ b/regression-test/suites/cloud_p0/query_retry/test_retry_e-230.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_retry_e-230") {
+suite("test_retry_e-230", 'docker') {
     if (!isCloudMode()) {
         return
     }
diff --git 
a/regression-test/suites/cloud_p0/schema_change/compaction10/test_schema_change_with_compaction10.groovy
 
b/regression-test/suites/cloud_p0/schema_change/compaction10/test_schema_change_with_compaction10.groovy
index b393979d442..ea5e818c2ee 100644
--- 
a/regression-test/suites/cloud_p0/schema_change/compaction10/test_schema_change_with_compaction10.groovy
+++ 
b/regression-test/suites/cloud_p0/schema_change/compaction10/test_schema_change_with_compaction10.groovy
@@ -20,7 +20,7 @@ import org.apache.http.NoHttpResponseException
 import org.apache.doris.regression.util.DebugPoint
 import org.apache.doris.regression.util.NodeType
 
-suite('test_schema_change_with_compaction10') {
+suite('test_schema_change_with_compaction10', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
@@ -260,4 +260,4 @@ suite('test_schema_change_with_compaction10') {
             assertTrue(out.contains("[8-16]"))
         }
     }
-}
\ No newline at end of file
+}
diff --git 
a/regression-test/suites/cloud_p0/schema_change/compaction11/test_schema_change_with_compaction11.groovy
 
b/regression-test/suites/cloud_p0/schema_change/compaction11/test_schema_change_with_compaction11.groovy
index fd257fcb7ea..d49d8646d3f 100644
--- 
a/regression-test/suites/cloud_p0/schema_change/compaction11/test_schema_change_with_compaction11.groovy
+++ 
b/regression-test/suites/cloud_p0/schema_change/compaction11/test_schema_change_with_compaction11.groovy
@@ -20,7 +20,7 @@ import org.apache.http.NoHttpResponseException
 import org.apache.doris.regression.util.DebugPoint
 import org.apache.doris.regression.util.NodeType
 
-suite('test_schema_change_with_compaction11') {
+suite('test_schema_change_with_compaction11', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
diff --git 
a/regression-test/suites/cloud_p0/schema_change/compaction5/test_schema_change_with_compaction5.groovy
 
b/regression-test/suites/cloud_p0/schema_change/compaction5/test_schema_change_with_compaction5.groovy
index f5028ff9e81..fd6267b85bc 100644
--- 
a/regression-test/suites/cloud_p0/schema_change/compaction5/test_schema_change_with_compaction5.groovy
+++ 
b/regression-test/suites/cloud_p0/schema_change/compaction5/test_schema_change_with_compaction5.groovy
@@ -20,7 +20,7 @@ import org.apache.http.NoHttpResponseException
 import org.apache.doris.regression.util.DebugPoint
 import org.apache.doris.regression.util.NodeType
 
-suite('test_schema_change_with_compaction5', 'nonConcurrent') {
+suite('test_schema_change_with_compaction5', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
@@ -257,4 +257,4 @@ suite('test_schema_change_with_compaction5', 
'nonConcurrent') {
             assertTrue(out.contains("[8-16]"))
         }
     }
-}
\ No newline at end of file
+}
diff --git 
a/regression-test/suites/cloud_p0/schema_change/compaction6/test_schema_change_with_compaction6.groovy
 
b/regression-test/suites/cloud_p0/schema_change/compaction6/test_schema_change_with_compaction6.groovy
index 951535433d1..d77db4eb2df 100644
--- 
a/regression-test/suites/cloud_p0/schema_change/compaction6/test_schema_change_with_compaction6.groovy
+++ 
b/regression-test/suites/cloud_p0/schema_change/compaction6/test_schema_change_with_compaction6.groovy
@@ -20,7 +20,7 @@ import org.apache.http.NoHttpResponseException
 import org.apache.doris.regression.util.DebugPoint
 import org.apache.doris.regression.util.NodeType
 
-suite('test_schema_change_with_compaction6', 'nonConcurrent') {
+suite('test_schema_change_with_compaction6', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
@@ -260,4 +260,4 @@ suite('test_schema_change_with_compaction6', 
'nonConcurrent') {
             assertTrue(out.contains("[8-16]"))
         }
     }
-}
\ No newline at end of file
+}
diff --git 
a/regression-test/suites/cloud_p0/schema_change/compaction9/test_schema_change_with_compaction9.groovy
 
b/regression-test/suites/cloud_p0/schema_change/compaction9/test_schema_change_with_compaction9.groovy
index 83c549eefc5..3797a89f565 100644
--- 
a/regression-test/suites/cloud_p0/schema_change/compaction9/test_schema_change_with_compaction9.groovy
+++ 
b/regression-test/suites/cloud_p0/schema_change/compaction9/test_schema_change_with_compaction9.groovy
@@ -20,7 +20,7 @@ import org.apache.http.NoHttpResponseException
 import org.apache.doris.regression.util.DebugPoint
 import org.apache.doris.regression.util.NodeType
 
-suite('test_schema_change_with_compaction9') {
+suite('test_schema_change_with_compaction9', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
@@ -257,4 +257,4 @@ suite('test_schema_change_with_compaction9') {
             assertTrue(out.contains("[8-16]"))
         }
     }
-}
\ No newline at end of file
+}
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 4a6ee4c847a..e9b60774efa 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/docker_action.groovy 
b/regression-test/suites/demo_p0/docker_action.groovy
index 6d62d6ea7be..bfe9c0039e2 100644
--- a/regression-test/suites/demo_p0/docker_action.groovy
+++ b/regression-test/suites/demo_p0/docker_action.groovy
@@ -17,7 +17,15 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite('docker_action') {
+// run docker suite steps:
+// 1. Read 'docker/runtime/doris-compose/Readme.md', make sure you can setup a 
doris docker cluster;
+// 2. update regression-conf-custom.groovy with config:
+//    image = "xxxx"                // your doris docker image
+//    excludeDockerTest = false     // do run docker suite, default is false
+//    dockerEndDeleteFiles = false  // after run docker suite, whether delete 
contains's log and data in directory '/tmp/doris/<suite-name>'
+
+// need add 'docker' to suite's group, and don't add 'nonConcurrent' to it
+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/insert_p0/group_commit/replay_wal_restart_fe.groovy 
b/regression-test/suites/insert_p0/group_commit/replay_wal_restart_fe.groovy
index d39bdd9d4a9..8347950ca6b 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/insert_p0/transaction/txn_insert_restart_fe.groovy 
b/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe.groovy
index 9d1e372224e..bd478bc2359 100644
--- a/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe.groovy
+++ b/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe.groovy
@@ -22,7 +22,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite("txn_insert_restart_fe") {
+suite("txn_insert_restart_fe", 'docker') {
     def get_observer_fe_url = {
         def fes = sql_return_maparray "show frontends"
         logger.info("frontends: ${fes}")
diff --git 
a/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe_with_schema_change.groovy
 
b/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe_with_schema_change.groovy
index fec2fc4378d..d2537bfe8c6 100644
--- 
a/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe_with_schema_change.groovy
+++ 
b/regression-test/suites/insert_p0/transaction/txn_insert_restart_fe_with_schema_change.groovy
@@ -22,7 +22,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.doris.regression.util.NodeType
 
-suite("txn_insert_restart_fe_with_schema_change") {
+suite("txn_insert_restart_fe_with_schema_change", 'docker') {
     def getAlterTableState = { dbName, show_sql ->
         def retry = 0
         sql "use ${dbName};"
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 f8478c3ea61..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,7 @@ 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 
     }
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/insert/test_publish_slow_not_wait.groovy 
b/regression-test/suites/load/insert/test_publish_slow_not_wait.groovy
index 8d3cddc4218..d9cd077eab0 100644
--- a/regression-test/suites/load/insert/test_publish_slow_not_wait.groovy
+++ b/regression-test/suites/load/insert/test_publish_slow_not_wait.groovy
@@ -17,7 +17,7 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite('test_publish_slow_not_wait') {
+suite('test_publish_slow_not_wait', 'docker') {
     def options = new ClusterOptions()
     options.beNum = 3
     options.feConfigs.add('disable_tablet_scheduler=true')
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/routine_load/test_routine_load_restart_fe.groovy
 
b/regression-test/suites/load_p0/routine_load/test_routine_load_restart_fe.groovy
index d60fbf265fd..d8ea6f91179 100644
--- 
a/regression-test/suites/load_p0/routine_load/test_routine_load_restart_fe.groovy
+++ 
b/regression-test/suites/load_p0/routine_load/test_routine_load_restart_fe.groovy
@@ -22,7 +22,7 @@ import org.apache.kafka.clients.producer.KafkaProducer
 import org.apache.kafka.clients.producer.ProducerRecord
 import org.apache.kafka.clients.producer.ProducerConfig
 
-suite("test_routine_load_restart_fe", "p0, nonConcurrent") {
+suite("test_routine_load_restart_fe", "docker") {
     def kafkaCsvTpoics = [
                   "test_out_of_range",
                 ]
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 fb80d4272dd..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,7 @@
 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
     }
diff --git 
a/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy
 
b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy
index db44f59216b..c52e5897aa0 100644
--- 
a/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy
+++ 
b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_mod_distribution_key.groovy
@@ -18,7 +18,7 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite("test_dynamic_partition_mod_distribution_key") {
+suite("test_dynamic_partition_mod_distribution_key", "docker") {
     def options = new ClusterOptions()
     options.setFeNum(2)
     docker(options) {
@@ -72,4 +72,4 @@ suite("test_dynamic_partition_mod_distribution_key") {
             assertEquals(9, result.size())
         }
     }
-}
\ No newline at end of file
+}
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/test_forward_qeury.groovy 
b/regression-test/suites/query_p0/test_forward_qeury.groovy
index 8dbef459d2d..28295e4ec89 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)
@@ -49,4 +49,4 @@ suite("test_forward_query") {
             assertTrue(false)
         }
     }
-}
\ 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/schema_change_p0/test_abort_txn_by_be_cloud1.groovy 
b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_cloud1.groovy
index 03f77917731..f2d0b767eb8 100644
--- a/regression-test/suites/schema_change_p0/test_abort_txn_by_be_cloud1.groovy
+++ b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_cloud1.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.http.NoHttpResponseException
 
-suite('test_abort_txn_by_be_cloud1') {
+suite('test_abort_txn_by_be_cloud1', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
diff --git 
a/regression-test/suites/schema_change_p0/test_abort_txn_by_be_cloud2.groovy 
b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_cloud2.groovy
index 7a2d382f3ab..7264ac7f90a 100644
--- a/regression-test/suites/schema_change_p0/test_abort_txn_by_be_cloud2.groovy
+++ b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_cloud2.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.http.NoHttpResponseException
 
-suite('test_abort_txn_by_be_cloud2') {
+suite('test_abort_txn_by_be_cloud2', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
diff --git 
a/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local5.groovy 
b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local5.groovy
index df4fb5d637e..0df8254ff25 100644
--- a/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local5.groovy
+++ b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local5.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.http.NoHttpResponseException
 
-suite('test_abort_txn_by_be_local5') {
+suite('test_abort_txn_by_be_local5', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = false
     options.skipRunWhenPipelineDiff = false
diff --git 
a/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local6.groovy 
b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local6.groovy
index 1f6e6df4417..a95d335579b 100644
--- a/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local6.groovy
+++ b/regression-test/suites/schema_change_p0/test_abort_txn_by_be_local6.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.http.NoHttpResponseException
 
-suite('test_abort_txn_by_be_local6') {
+suite('test_abort_txn_by_be_local6', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = false
     options.skipRunWhenPipelineDiff = true
diff --git 
a/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_cloud4.groovy 
b/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_cloud4.groovy
index bd12d57fd34..80b61e16efd 100644
--- a/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_cloud4.groovy
+++ b/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_cloud4.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.http.NoHttpResponseException
 
-suite('test_abort_txn_by_fe_cloud4') {
+suite('test_abort_txn_by_fe_cloud4', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = true
     options.enableDebugPoints()
diff --git 
a/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_local3.groovy 
b/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_local3.groovy
index 37667abe950..355dab05879 100644
--- a/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_local3.groovy
+++ b/regression-test/suites/schema_change_p0/test_abort_txn_by_fe_local3.groovy
@@ -18,7 +18,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.apache.http.NoHttpResponseException
 
-suite('test_abort_txn_by_fe_local3') {
+suite('test_abort_txn_by_fe_local3', 'docker') {
     def options = new ClusterOptions()
     options.cloudMode = false
     options.skipRunWhenPipelineDiff = false
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 bd06680d2b2..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,7 @@
 
 import org.apache.doris.regression.suite.ClusterOptions
 
-suite('test_storage_medium_has_disk') {
+suite('test_storage_medium_has_disk', 'docker') {
     if (isCloudMode()) {
         return
     }
diff --git a/regression-test/suites/trash_p0/clean_trash.groovy 
b/regression-test/suites/trash_p0/clean_trash.groovy
index 71438b5b1b5..fdfafc4887f 100644
--- a/regression-test/suites/trash_p0/clean_trash.groovy
+++ b/regression-test/suites/trash_p0/clean_trash.groovy
@@ -17,7 +17,7 @@
 import org.apache.doris.regression.suite.ClusterOptions
 import org.junit.Assert
 
-suite("test_clean_trash", "p0") {
+suite("test_clean_trash", "docker") {
     if (isCloudMode()) {
         return
     }
@@ -77,4 +77,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_c_p0/test_mow_full_clone_exception.groovy
 
b/regression-test/suites/unique_with_mow_c_p0/test_mow_full_clone_exception.groovy
index 516cff9d4f5..6ab872239cd 100644
--- 
a/regression-test/suites/unique_with_mow_c_p0/test_mow_full_clone_exception.groovy
+++ 
b/regression-test/suites/unique_with_mow_c_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/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 ea7ced8be94..6357f4111a7 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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to