You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2025/03/24 01:11:28 UTC

(shardingsphere) branch master updated: Refactor StorageContainer. (#35055)

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

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 0dd602d0a6d Refactor StorageContainer. (#35055)
0dd602d0a6d is described below

commit 0dd602d0a6d48c7a9eeb015028f8051c89421fa2
Author: Cong Hu <ia...@gmail.com>
AuthorDate: Mon Mar 24 09:11:23 2025 +0800

    Refactor StorageContainer. (#35055)
---
 .../adapter/impl/ShardingSphereJdbcContainer.java  |  14 +--
 .../atomic/storage/DockerStorageContainer.java     |  12 +++
 .../atomic/storage/EmbeddedStorageContainer.java   |   6 ++
 .../container/atomic/storage/StorageContainer.java |   7 ++
 .../env/container/atomic/util/SQLScriptUtils.java  | 115 +++++++++++++++++++++
 .../test/e2e/env/E2EEnvironmentEngine.java         |  32 +-----
 6 files changed, 143 insertions(+), 43 deletions(-)

diff --git a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereJdbcContainer.java b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereJdbcContainer.java
index 4b5fddc7e83..8961ace92d0 100644
--- a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereJdbcContainer.java
+++ b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereJdbcContainer.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.impl;
 
 import com.zaxxer.hikari.HikariDataSource;
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.test.e2e.env.container.atomic.DockerITContainer;
 import org.apache.shardingsphere.test.e2e.env.container.atomic.EmbeddedITContainer;
 import org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.AdapterContainer;
 import org.apache.shardingsphere.test.e2e.env.container.atomic.storage.StorageContainer;
@@ -31,7 +30,6 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -68,7 +66,7 @@ public final class ShardingSphereJdbcContainer implements EmbeddedITContainer, A
     private DataSource createTargetDataSource() {
         HikariDataSource result = new HikariDataSource();
         result.setDriverClassName("org.apache.shardingsphere.driver.ShardingSphereDriver");
-        result.setJdbcUrl("jdbc:shardingsphere:absolutepath:" + processFile(configPath, getLinkReplacements()));
+        result.setJdbcUrl("jdbc:shardingsphere:absolutepath:" + processFile(configPath, storageContainer.getLinkReplacements()));
         result.setUsername("root");
         result.setPassword("Root@123");
         result.setMaximumPoolSize(2);
@@ -77,16 +75,6 @@ public final class ShardingSphereJdbcContainer implements EmbeddedITContainer, A
         return result;
     }
     
-    private Map<String, String> getLinkReplacements() {
-        Map<String, String> replacements = new HashMap<>();
-        for (String each : ((DockerITContainer) storageContainer).getNetworkAliases()) {
-            for (Integer exposedPort : ((DockerITContainer) storageContainer).getExposedPorts()) {
-                replacements.put(each + ":" + exposedPort, "127.0.0.1:" + ((DockerITContainer) storageContainer).getMappedPort(exposedPort));
-            }
-        }
-        return replacements;
-    }
-    
     private String processFile(final String filePath, final Map<String, String> replacements) throws IOException {
         Path path = Paths.get(filePath);
         String content = new String(Files.readAllBytes(path));
diff --git a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/DockerStorageContainer.java b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/DockerStorageContainer.java
index 8feed7f48b2..2f6aec2b0de 100644
--- a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/DockerStorageContainer.java
+++ b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/DockerStorageContainer.java
@@ -30,6 +30,7 @@ import org.testcontainers.containers.BindMode;
 import javax.sql.DataSource;
 import java.sql.DriverManager;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -161,4 +162,15 @@ public abstract class DockerStorageContainer extends DockerITContainer implement
     public final String getAbbreviation() {
         return databaseType.getType().toLowerCase();
     }
+    
+    @Override
+    public Map<String, String> getLinkReplacements() {
+        Map<String, String> replacements = new HashMap<>();
+        for (String each : getNetworkAliases()) {
+            for (Integer exposedPort : getExposedPorts()) {
+                replacements.put(each + ":" + exposedPort, getHost() + ":" + getMappedPort(exposedPort));
+            }
+        }
+        return replacements;
+    }
 }
diff --git a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/EmbeddedStorageContainer.java b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/EmbeddedStorageContainer.java
index cea74cddf95..49a913091ff 100644
--- a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/EmbeddedStorageContainer.java
+++ b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/EmbeddedStorageContainer.java
@@ -26,6 +26,7 @@ import org.apache.shardingsphere.test.e2e.env.runtime.scenario.database.Database
 
 import javax.sql.DataSource;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -74,4 +75,9 @@ public abstract class EmbeddedStorageContainer implements EmbeddedITContainer, S
     public final String getAbbreviation() {
         return databaseType.getType().toLowerCase();
     }
+    
+    @Override
+    public Map<String, String> getLinkReplacements() {
+        return Collections.emptyMap();
+    }
 }
diff --git a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/StorageContainer.java b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/StorageContainer.java
index e24d1af57e1..e6a71950001 100644
--- a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/StorageContainer.java
+++ b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/StorageContainer.java
@@ -40,4 +40,11 @@ public interface StorageContainer extends ITContainer {
      * @return expected data source map
      */
     Map<String, DataSource> getExpectedDataSourceMap();
+    
+    /**
+     * Get link replacements.
+     *
+     * @return link replacements
+     */
+    Map<String, String> getLinkReplacements();
 }
diff --git a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/util/SQLScriptUtils.java b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/util/SQLScriptUtils.java
new file mode 100644
index 00000000000..3ee2219f802
--- /dev/null
+++ b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/util/SQLScriptUtils.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.test.e2e.env.container.atomic.util;
+
+import lombok.SneakyThrows;
+import org.apache.commons.lang3.StringUtils;
+import org.h2.util.ScriptReader;
+
+import javax.sql.DataSource;
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * Batched SQL utility class.
+ */
+public final class SQLScriptUtils {
+    
+    private static final int BATCH_SIZE = 100;
+    
+    /**
+     * Execute SQL script.
+     *
+     * @param dataSource data source
+     * @param scriptFilePath script file path
+     */
+    @SneakyThrows({SQLException.class, IOException.class})
+    public static void execute(final DataSource dataSource, final String scriptFilePath) {
+        try (
+                Connection connection = dataSource.getConnection();
+                Reader reader = getReader(scriptFilePath)) {
+            Statement statement = connection.createStatement();
+            ScriptReader r = new ScriptReader(reader);
+            r.setSkipRemarks(true);
+            while (true) {
+                String sql = r.readStatement();
+                if (null == sql) {
+                    break;
+                }
+                if (StringUtils.isBlank(sql)) {
+                    continue;
+                }
+                statement.execute(sql);
+            }
+        }
+    }
+    
+    /**
+     * Execute SQL script.
+     *
+     * @param dataSource data source
+     * @param scriptFilePath script file path
+     */
+    @SneakyThrows({SQLException.class, IOException.class})
+    public static void executeBatch(final DataSource dataSource, final String scriptFilePath) {
+        try (
+                Connection connection = dataSource.getConnection();
+                Reader reader = getReader(scriptFilePath)) {
+            Statement statement = connection.createStatement();
+            ScriptReader r = new ScriptReader(reader);
+            r.setSkipRemarks(true);
+            int count = 0;
+            while (true) {
+                String sql = r.readStatement();
+                if (null == sql) {
+                    break;
+                }
+                if (StringUtils.isBlank(sql)) {
+                    continue;
+                }
+                statement.addBatch(sql);
+                count++;
+                if (0 == count % BATCH_SIZE) {
+                    statement.executeBatch();
+                    statement.clearBatch();
+                }
+            }
+            if (0 != count % BATCH_SIZE) {
+                statement.executeBatch();
+            }
+        }
+    }
+    
+    private static Reader getReader(final String scriptFilePath) throws FileNotFoundException {
+        InputStream resourceAsStream = SQLScriptUtils.class.getClassLoader().getResourceAsStream(StringUtils.removeStart(scriptFilePath, "/"));
+        if (resourceAsStream != null) {
+            return new BufferedReader(new InputStreamReader(resourceAsStream, StandardCharsets.UTF_8));
+        } else {
+            return new FileReader(scriptFilePath);
+        }
+    }
+}
diff --git a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/env/E2EEnvironmentEngine.java b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/env/E2EEnvironmentEngine.java
index b1eb9e3b03c..663d4b74cfc 100644
--- a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/env/E2EEnvironmentEngine.java
+++ b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/env/E2EEnvironmentEngine.java
@@ -18,23 +18,16 @@
 package org.apache.shardingsphere.test.e2e.env;
 
 import lombok.Getter;
-import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.test.e2e.container.compose.ContainerComposer;
 import org.apache.shardingsphere.test.e2e.container.compose.ContainerComposerRegistry;
 import org.apache.shardingsphere.test.e2e.env.container.atomic.enums.AdapterMode;
 import org.apache.shardingsphere.test.e2e.env.container.atomic.enums.AdapterType;
+import org.apache.shardingsphere.test.e2e.env.container.atomic.util.SQLScriptUtils;
 import org.apache.shardingsphere.test.e2e.env.runtime.scenario.path.ScenarioDataPath;
-import org.h2.util.ScriptReader;
-import org.h2.util.StringUtils;
 
 import javax.sql.DataSource;
-import java.io.FileReader;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
@@ -67,7 +60,6 @@ public final class E2EEnvironmentEngine {
         executeLogicDatabaseInitSQLFileOnlyOnce(key, scenario, databaseType, targetDataSource);
     }
     
-    @SneakyThrows({SQLException.class, IOException.class})
     private void executeLogicDatabaseInitSQLFileOnlyOnce(final String key, final String scenario, final DatabaseType databaseType, final DataSource targetDataSource) {
         Optional<String> logicDatabaseInitSQLFile = new ScenarioDataPath(scenario).findActualDatabaseInitSQLFile(DefaultDatabase.LOGIC_NAME, databaseType);
         if (!logicDatabaseInitSQLFile.isPresent()) {
@@ -77,30 +69,10 @@ public final class E2EEnvironmentEngine {
         if (!INITIALIZED_SUITES.contains(cacheKey)) {
             synchronized (INITIALIZED_SUITES) {
                 if (!INITIALIZED_SUITES.contains(cacheKey)) {
-                    executeInitSQL(targetDataSource, logicDatabaseInitSQLFile.get());
+                    SQLScriptUtils.execute(targetDataSource, logicDatabaseInitSQLFile.get());
                     INITIALIZED_SUITES.add(cacheKey);
                 }
             }
         }
     }
-    
-    private void executeInitSQL(final DataSource dataSource, final String logicDatabaseInitSQLFile) throws SQLException, IOException {
-        try (
-                Connection connection = dataSource.getConnection();
-                FileReader reader = new FileReader(logicDatabaseInitSQLFile)) {
-            Statement stat = connection.createStatement();
-            ScriptReader r = new ScriptReader(reader);
-            r.setSkipRemarks(true);
-            while (true) {
-                String sql = r.readStatement();
-                if (null == sql) {
-                    break;
-                }
-                if (StringUtils.isWhitespaceOrEmpty(sql)) {
-                    continue;
-                }
-                stat.execute(sql);
-            }
-        }
-    }
 }