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);
- }
- }
- }
}