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

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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 7b904cf6185 [fix][regression] update ccr test framework (#32565)
7b904cf6185 is described below

commit 7b904cf6185ef48d4d0cc07025bd9671093f1b0b
Author: XuJianxu <[email protected]>
AuthorDate: Thu Mar 21 17:57:39 2024 +0800

    [fix][regression] update ccr test framework (#32565)
    
    
    Co-authored-by: 胥剑旭 <[email protected]>
---
 .../org/apache/doris/regression/Config.groovy      | 50 ++++++++++++++++++++++
 .../org/apache/doris/regression/suite/Suite.groovy | 35 ++++++++++++++-
 .../doris/regression/suite/SuiteContext.groovy     | 17 +++++---
 .../doris/regression/suite/SyncerContext.groovy    |  6 +--
 .../pipeline/p0/conf/regression-conf.groovy        |  5 +++
 .../pipeline/p1/conf/regression-conf.groovy        |  5 +++
 6 files changed, 108 insertions(+), 10 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 4fc3705a09e..cf6e112260c 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
@@ -41,6 +41,10 @@ class Config {
     public String jdbcPassword
     public String defaultDb
 
+    public String ccrDownstreamUrl
+    public String ccrDownstreamUser
+    public String ccrDownstreamPassword
+
     public String feSourceThriftAddress
     public String feTargetThriftAddress
     public String feSyncerUser
@@ -314,6 +318,9 @@ class Config {
             configToString(obj.sslCertificatePath)
         )
 
+        config.ccrDownstreamUrl = configToString(obj.ccrDownstreamUrl)
+        config.ccrDownstreamUser = configToString(obj.ccrDownstreamUser)
+        config.ccrDownstreamPassword = 
configToString(obj.ccrDownstreamPassword)
         config.image = configToString(obj.image)
         config.dockerEndDeleteFiles = configToBoolean(obj.dockerEndDeleteFiles)
         config.excludeDockerTest = configToBoolean(obj.excludeDockerTest)
@@ -543,6 +550,49 @@ class Config {
         return DriverManager.getConnection(dbUrl, jdbcUser, jdbcPassword)
     }
 
+    public static String buildUrlWithDbImpl(String jdbcUrl, String dbName) {
+        String urlWithDb = jdbcUrl
+        String urlWithoutSchema = jdbcUrl.substring(jdbcUrl.indexOf("://") + 3)
+        if (urlWithoutSchema.indexOf("/") >= 0) {
+            if (jdbcUrl.contains("?")) {
+                // e.g: jdbc:mysql://locahost:8080/?a=b
+                urlWithDb = jdbcUrl.substring(0, jdbcUrl.lastIndexOf("?"))
+                urlWithDb = urlWithDb.substring(0, urlWithDb.lastIndexOf("/"))
+                urlWithDb += ("/" + dbName) + 
jdbcUrl.substring(jdbcUrl.lastIndexOf("?"))
+            } else {
+                // e.g: jdbc:mysql://locahost:8080/
+                urlWithDb += dbName
+            }
+        } else {
+            // e.g: jdbc:mysql://locahost:8080
+            urlWithDb += ("/" + dbName)
+        }
+
+        return urlWithDb
+    }
+
+    Connection getConnectionByArrowFlightSql(String dbName) {
+        Class.forName("org.apache.arrow.driver.jdbc.ArrowFlightJdbcDriver")
+        String arrowFlightSqlHost = otherConfigs.get("extArrowFlightSqlHost")
+        String arrowFlightSqlPort = otherConfigs.get("extArrowFlightSqlPort")
+        String arrowFlightSqlUrl = 
"jdbc:arrow-flight-sql://${arrowFlightSqlHost}:${arrowFlightSqlPort}" +
+                "/?useServerPrepStmts=false&useSSL=false&useEncryption=false"
+        // TODO jdbc:arrow-flight-sql not support connect db
+        String dbUrl = buildUrlWithDbImpl(arrowFlightSqlUrl, dbName)
+        tryCreateDbIfNotExist(dbName)
+        log.info("connect to ${dbUrl}".toString())
+        String arrowFlightSqlJdbcUser = 
otherConfigs.get("extArrowFlightSqlUser")
+        String arrowFlightSqlJdbcPassword = 
otherConfigs.get("extArrowFlightSqlPassword")
+        return DriverManager.getConnection(dbUrl, arrowFlightSqlJdbcUser, 
arrowFlightSqlJdbcPassword)
+    }
+
+    Connection getDownstreamConnectionByDbName(String dbName) {
+        String dbUrl = buildUrlWithDb(ccrDownstreamUrl, dbName)
+        tryCreateDbIfNotExist(dbName)
+        log.info("connect to ${dbUrl}".toString())
+        return DriverManager.getConnection(dbUrl, ccrDownstreamUser, 
ccrDownstreamPassword)
+    }
+
     String getDbNameByFile(File suiteFile) {
         String dir = new File(suitePath).relativePath(suiteFile.parentFile)
         // We put sql files under sql dir, so dbs and tables used by cases
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 9ba50881b88..4bc8beab809 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
@@ -51,6 +51,7 @@ import java.util.stream.Collectors
 import java.util.stream.LongStream
 import static org.apache.doris.regression.util.DataUtils.sortByToString
 
+import java.sql.Connection
 import java.sql.DriverManager
 import java.sql.PreparedStatement
 import java.sql.ResultSetMetaData
@@ -259,9 +260,34 @@ class Suite implements GroovyInterceptable {
         return result
     }
 
-    def sql_return_maparray(String sqlStr) {
+    List<List<Object>> insert_into_sql_impl(Connection conn, String sqlStr, 
int num) {
+        logger.info("insert into " + num + " records")
+        def (result, meta) = JdbcUtils.executeToList(conn, sqlStr)
+        return result
+    }
+
+    List<List<Object>> jdbc_insert_into_sql(String sqlStr, int num) {
+        return insert_into_sql_impl(context.getConnection(), sqlStr, num)
+    }
+
+    List<List<Object>> arrow_flight_insert_into_sql(String sqlStr, int num) {
+        return insert_into_sql_impl(context.getArrowFlightSqlConnection(), 
(String) ("USE ${context.dbName};" + sqlStr), num)
+    }
+
+    List<List<Object>> insert_into_sql(String sqlStr, int num) {
+        if (context.useArrowFlightSql()) {
+            return arrow_flight_insert_into_sql(sqlStr, num)
+        } else {
+            return jdbc_insert_into_sql(sqlStr, num)
+        }
+    }
+
+    def sql_return_maparray(String sqlStr, Connection conn = null) {        
         logger.info("Execute sql: ${sqlStr}".toString())
-        def (result, meta) = JdbcUtils.executeToList(context.getConnection(), 
sqlStr)
+        if (conn == null) {
+            conn = context.getConnection()
+        }
+        def (result, meta) = JdbcUtils.executeToList(conn, sqlStr)
 
         // get all column names as list
         List<String> columnNames = new ArrayList<>()
@@ -516,6 +542,11 @@ class Suite implements GroovyInterceptable {
         return lines;
     }
 
+
+    Connection getTargetConnection() {
+        return context.getTargetConnection(this)
+    }
+    
     boolean deleteFile(String filePath) {
         def file = new File(filePath)
         file.delete()
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteContext.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteContext.groovy
index 9cc21faae07..b2a2cb7ba1e 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteContext.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteContext.groovy
@@ -152,9 +152,14 @@ class SuiteContext implements Closeable {
         return subJdbc.substring(0, subJdbc.indexOf("/"))
     }
 
-    private Map<String, String> getSpec() {
+    private String getDownstreamJdbcNetInfo() {
+        String subJdbc = 
config.ccrDownstreamUrl.substring(config.ccrDownstreamUrl.indexOf("://") + 3)
+        return subJdbc.substring(0, subJdbc.indexOf("/"))
+    }
+
+    private Map<String, String> getSpec(String[] jdbc) {
         Map<String, String> spec = Maps.newHashMap()
-        String[] jdbc = getJdbcNetInfo().split(":")
+
         spec.put("host", jdbc[0])
         spec.put("port", jdbc[1])
         spec.put("user", config.feSyncerUser)
@@ -165,7 +170,8 @@ class SuiteContext implements Closeable {
     }
 
     Map<String, String> getSrcSpec() {
-        Map<String, String> spec = getSpec()
+        String[] jdbc = getJdbcNetInfo().split(":")
+        Map<String, String> spec = getSpec(jdbc)
         spec.put("thrift_port", 
config.feSourceThriftNetworkAddress.port.toString())
         spec.put("database", dbName)
 
@@ -173,7 +179,8 @@ class SuiteContext implements Closeable {
     }
 
     Map<String, String> getDestSpec() {
-        Map<String, String> spec = getSpec()
+        String[] jdbc = getDownstreamJdbcNetInfo().split(":")
+        Map<String, String> spec = getSpec(jdbc)
         spec.put("thrift_port", 
config.feTargetThriftNetworkAddress.port.toString())
         spec.put("database", "TEST_" + dbName)
 
@@ -203,7 +210,7 @@ class SuiteContext implements Closeable {
     Connection getTargetConnection(Suite suite) {
         def context = getSyncer(suite).context
         if (context.targetConnection == null) {
-            context.targetConnection = config.getConnectionByDbName("TEST_" + 
dbName)
+            context.targetConnection = 
config.getDownstreamConnectionByDbName("TEST_" + dbName)
         }
         return context.targetConnection
     }
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SyncerContext.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SyncerContext.groovy
index 388904ec2da..92214532fdc 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SyncerContext.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SyncerContext.groovy
@@ -147,8 +147,8 @@ class SyncerContext {
         return info
     }
 
-    FrontendClientImpl getMasterFrontClient() {
-        def result = suite.sql_return_maparray "select Host, RpcPort, IsMaster 
from frontends();"
+    FrontendClientImpl getMasterFrontClient(Connection conn) {
+        def result = suite.sql_return_maparray("select Host, RpcPort, IsMaster 
from frontends();", conn)
         logger.info("get master fe: ${result}")
 
         def masterHost = ""
@@ -179,7 +179,7 @@ class SyncerContext {
 
     FrontendClientImpl getTargetFrontClient() {
         if (targetFrontendClient == null) {
-            targetFrontendClient = getMasterFrontClient()
+            targetFrontendClient = 
getMasterFrontClient(suite.getTargetConnection())
         }
         return targetFrontendClient
     }
diff --git a/regression-test/pipeline/p0/conf/regression-conf.groovy 
b/regression-test/pipeline/p0/conf/regression-conf.groovy
index 8cfe8811993..615cb4f81c0 100644
--- a/regression-test/pipeline/p0/conf/regression-conf.groovy
+++ b/regression-test/pipeline/p0/conf/regression-conf.groovy
@@ -25,6 +25,11 @@ targetJdbcUrl = 
"jdbc:mysql://172.19.0.2:9131/?useLocalSessionState=true&allowLo
 jdbcUser = "root"
 jdbcPassword = ""
 
+ccrDownstreamUrl = 
"jdbc:mysql://172.19.0.2:9131/?useLocalSessionState=true&allowLoadLocalInfile=true"
+ccrDownstreamUser = "root"
+ccrDownstreamPassword = ""
+ccrDownstreamFeThriftAddress = "127.0.0.1:9020"
+
 feSourceThriftAddress = "127.0.0.1:9020"
 feTargetThriftAddress = "127.0.0.1:9020"
 feSyncerUser = "root"
diff --git a/regression-test/pipeline/p1/conf/regression-conf.groovy 
b/regression-test/pipeline/p1/conf/regression-conf.groovy
index 8669e8fb5bd..98f0d9173b2 100644
--- a/regression-test/pipeline/p1/conf/regression-conf.groovy
+++ b/regression-test/pipeline/p1/conf/regression-conf.groovy
@@ -25,6 +25,11 @@ targetJdbcUrl = 
"jdbc:mysql://172.19.0.2:9132/?useLocalSessionState=true&allowLo
 jdbcUser = "root"
 jdbcPassword = ""
 
+ccrDownstreamUrl = 
"jdbc:mysql://172.19.0.2:9132/?useLocalSessionState=true&allowLoadLocalInfile=true"
+ccrDownstreamUser = "root"
+ccrDownstreamPassword = ""
+ccrDownstreamFeThriftAddress = "127.0.0.1:9020"
+
 feSourceThriftAddress = "127.0.0.1:9020"
 feTargetThriftAddress = "127.0.0.1:9020"
 feSyncerUser = "root"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to