This is an automated email from the ASF dual-hosted git repository.
zhouyao2023 pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new b7a0fc5e43 [Fix][E2E] Fix flaky CI failure in
`KingbaseDialectContainerTest` (#10674)
b7a0fc5e43 is described below
commit b7a0fc5e433a0caaf700668ee2c4ff4c04a3a3cf
Author: Doyeon Kim <[email protected]>
AuthorDate: Thu Apr 2 11:43:40 2026 +0900
[Fix][E2E] Fix flaky CI failure in `KingbaseDialectContainerTest` (#10674)
---
.../container/AbstractKingbaseContainerTest.java | 49 +++++++++++++----
.../container/KingbaseCatalogContainerTest.java | 2 +-
.../container/KingbaseDialectContainerTest.java | 64 +++++++++++-----------
3 files changed, 70 insertions(+), 45 deletions(-)
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/AbstractKingbaseContainerTest.java
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/AbstractKingbaseContainerTest.java
index c4be8aa731..b9a96f97b8 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/AbstractKingbaseContainerTest.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/AbstractKingbaseContainerTest.java
@@ -23,6 +23,7 @@ import
org.apache.seatunnel.connectors.seatunnel.jdbc.catalog.kingbase.KingbaseC
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.OS;
import org.testcontainers.containers.GenericContainer;
@@ -44,6 +45,7 @@ import java.time.Duration;
* errors, please replace the image with a newly built one that contains a
valid license.
*/
@DisabledOnOs(OS.WINDOWS)
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public abstract class AbstractKingbaseContainerTest {
protected static final String KINGBASE_IMAGE =
"liangyaobo/kingbase:v8r6-license";
@@ -53,12 +55,12 @@ public abstract class AbstractKingbaseContainerTest {
protected static final String SCHEMA = "public";
protected static final int KINGBASE_PORT = 54321;
- protected static GenericContainer<?> kingbaseContainer;
- protected static Connection connection;
- protected static KingbaseCatalog catalog;
+ protected GenericContainer<?> kingbaseContainer;
+ protected String jdbcUrl;
+ protected KingbaseCatalog catalog;
@BeforeAll
- public static void startContainer() throws SQLException {
+ public void startContainer() throws SQLException {
DockerImageName imageName = DockerImageName.parse(KINGBASE_IMAGE);
kingbaseContainer =
@@ -73,9 +75,9 @@ public abstract class AbstractKingbaseContainerTest {
String host = kingbaseContainer.getHost();
Integer mappedPort = kingbaseContainer.getMappedPort(KINGBASE_PORT);
- String jdbcUrl = String.format("jdbc:kingbase8://%s:%d/%s", host,
mappedPort, DATABASE);
+ jdbcUrl = String.format("jdbc:kingbase8://%s:%d/%s", host, mappedPort,
DATABASE);
- connection = connectWithRetry(jdbcUrl, USERNAME, PASSWORD);
+ waitUntilSqlReady();
catalog =
new KingbaseCatalog(
@@ -89,24 +91,49 @@ public abstract class AbstractKingbaseContainerTest {
}
@AfterAll
- public static void stopContainer() throws SQLException {
+ public void stopContainer() {
if (catalog != null) {
catalog.close();
}
- if (connection != null && !connection.isClosed()) {
- connection.close();
- }
if (kingbaseContainer != null) {
kingbaseContainer.stop();
}
}
protected void executeSql(String sql) throws SQLException {
- try (Statement stmt = connection.createStatement()) {
+ try (Connection connection = getConnection();
+ Statement stmt = connection.createStatement()) {
stmt.execute(sql);
}
}
+ protected Connection getConnection() throws SQLException {
+ return connectWithRetry(jdbcUrl, USERNAME, PASSWORD);
+ }
+
+ private void waitUntilSqlReady() throws SQLException {
+ RetryUtils.RetryMaterial retryMaterial =
+ new RetryUtils.RetryMaterial(30, true, exception -> true,
2000);
+
+ try {
+ RetryUtils.retryWithException(
+ () -> {
+ try (Connection connection =
+ DriverManager.getConnection(jdbcUrl,
USERNAME, PASSWORD);
+ Statement stmt = connection.createStatement())
{
+ stmt.execute("SELECT 1");
+ }
+ return null;
+ },
+ retryMaterial);
+ } catch (Exception e) {
+ if (e instanceof SQLException) {
+ throw (SQLException) e;
+ }
+ throw new SQLException("Kingbase is not ready to execute SQL", e);
+ }
+ }
+
private static Connection connectWithRetry(String jdbcUrl, String
username, String password)
throws SQLException {
RetryUtils.RetryMaterial retryMaterial =
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseCatalogContainerTest.java
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseCatalogContainerTest.java
index 936ddc42f4..7de73e6290 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseCatalogContainerTest.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseCatalogContainerTest.java
@@ -95,7 +95,7 @@ public class KingbaseCatalogContainerTest extends
AbstractKingbaseContainerTest
}
@Test
- public void testCreateTableViaAPI() throws SQLException {
+ public void testCreateTableViaAPI() {
String testTableName = "test_api_create_table";
TablePath tablePath = TablePath.of(DATABASE, SCHEMA, testTableName);
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseDialectContainerTest.java
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseDialectContainerTest.java
index 29cec63763..c195d9d353 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseDialectContainerTest.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/kingbase/container/KingbaseDialectContainerTest.java
@@ -28,6 +28,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.OS;
+import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -41,36 +42,37 @@ import java.util.Optional;
@DisabledOnOs(OS.WINDOWS)
public class KingbaseDialectContainerTest extends
AbstractKingbaseContainerTest {
- private static KingbaseDialect dialect;
private static final String TEST_TABLE = "dialect_test_table";
+ private KingbaseDialect dialect;
@BeforeAll
- public static void setupDialect() throws SQLException {
+ public void setupDialect() throws SQLException {
dialect = new KingbaseDialect();
- String createTableSql =
- String.format(
- "CREATE TABLE %s.%s ("
- + "id INT8 PRIMARY KEY, "
- + "name VARCHAR(100), "
- + "value NUMERIC(10,2), "
- + "created_at TIMESTAMP"
- + ")",
- quoteIdentifier(SCHEMA), quoteIdentifier(TEST_TABLE));
+ String qualifiedTable =
+ String.format("%s.%s", quoteIdentifier(SCHEMA),
quoteIdentifier(TEST_TABLE));
- try (Statement stmt = connection.createStatement()) {
- stmt.execute(createTableSql);
- }
+ String createTableSql =
+ "CREATE TABLE IF NOT EXISTS "
+ + qualifiedTable
+ + " ("
+ + "id BIGINT PRIMARY KEY, "
+ + "name VARCHAR(100), "
+ + "value NUMERIC(10,2), "
+ + "created_at TIMESTAMP"
+ + ")";
+ executeSql(createTableSql);
+
+ String truncateSql = "TRUNCATE TABLE " + qualifiedTable;
+ executeSql(truncateSql);
// Insert test data
String insertSql =
- String.format(
- "INSERT INTO %s.%s (id, name, value, created_at) "
- + "VALUES (1, 'test1', 100.50,
CURRENT_TIMESTAMP)",
- quoteIdentifier(SCHEMA), quoteIdentifier(TEST_TABLE));
- try (Statement stmt = connection.createStatement()) {
- stmt.execute(insertSql);
- }
+ "INSERT INTO "
+ + qualifiedTable
+ + " (id, name, value, created_at) "
+ + "VALUES (1, 'test1', 100.50, CURRENT_TIMESTAMP)";
+ executeSql(insertSql);
}
@Test
@@ -221,7 +223,8 @@ public class KingbaseDialectContainerTest extends
AbstractKingbaseContainerTest
executeSql(insertSql);
// Verify insert
- try (Statement stmt = connection.createStatement();
+ try (Connection connection = getConnection();
+ Statement stmt = connection.createStatement();
ResultSet rs =
stmt.executeQuery(
String.format(
@@ -290,20 +293,15 @@ public class KingbaseDialectContainerTest extends
AbstractKingbaseContainerTest
@Test
public void testCreatPreparedStatement() throws SQLException {
- PreparedStatement ps = null;
- try {
- String sql =
- String.format(
- "SELECT * FROM %s.%s",
- quoteIdentifier(SCHEMA),
quoteIdentifier(TEST_TABLE));
- ps = dialect.creatPreparedStatement(connection, sql, 100);
+ String sql =
+ String.format(
+ "SELECT * FROM %s.%s",
+ quoteIdentifier(SCHEMA), quoteIdentifier(TEST_TABLE));
+ try (Connection connection = getConnection();
+ PreparedStatement ps =
dialect.creatPreparedStatement(connection, sql, 100)) {
Assertions.assertNotNull(ps);
Assertions.assertEquals(100, ps.getFetchSize());
- } finally {
- if (ps != null) {
- ps.close();
- }
}
}