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

jianglongtao pushed a commit to branch fix-33341
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git

commit d619eb465e48ef92a4d6d7f5a9c9868f6fc38756
Author: Raigor <[email protected]>
AuthorDate: Thu Sep 5 10:54:57 2024 +0800

    Pick #31977, keep inused storage node when unregister storage unit (#9)
---
 .../mode/manager/switcher/ResourceSwitchManager.java | 20 ++++++++++++++++++--
 .../test/e2e/engine/type/dml/BaseDMLE2EIT.java       | 18 +++++++++---------
 2 files changed, 27 insertions(+), 11 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
index ae29706d9a1..101b55c9327 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
@@ -22,11 +22,13 @@ import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePo
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNodeAggregator;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnitNodeMapCreator;
 
 import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -117,17 +119,31 @@ public final class ResourceSwitchManager {
     }
     
     private Map<StorageNode, DataSource> getToBeRemovedStaleDataSource(final 
ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) {
-        Map<StorageNode, DataSource> result = new LinkedHashMap<>();
+        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(storageUnitNames.size(), 1F);
+        Map<String, StorageUnit> reservedStorageUnits = 
getReservedStorageUnits(resourceMetaData, storageUnitNames);
         for (String each : storageUnitNames) {
             if (!resourceMetaData.getStorageUnits().containsKey(each)) {
-                return Collections.emptyMap();
+                continue;
             }
             StorageNode storageNode = 
resourceMetaData.getStorageUnits().get(each).getStorageNode();
+            if (isStorageNodeInUsed(reservedStorageUnits, storageNode)) {
+                continue;
+            }
             result.put(storageNode, 
resourceMetaData.getDataSources().get(storageNode));
         }
         return result;
     }
     
+    private Map<String, StorageUnit> getReservedStorageUnits(final 
ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) {
+        Map<String, StorageUnit> result = new 
HashMap<>(resourceMetaData.getStorageUnits());
+        result.keySet().removeIf(storageUnitNames::contains);
+        return result;
+    }
+    
+    private boolean isStorageNodeInUsed(final Map<String, StorageUnit> 
reservedStorageUnits, final StorageNode storageNode) {
+        return reservedStorageUnits.values().stream().anyMatch(each -> 
each.getStorageNode().equals(storageNode));
+    }
+    
     private void removeToBeRemovedStorageUnitNames(final ResourceMetaData 
resourceMetaData, final Map<String, DataSourcePoolProperties> 
dataSourcePoolPropsMap,
                                                    final Collection<String> 
storageUnitNames) {
         for (String each : storageUnitNames) {
diff --git 
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java
 
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java
index 7f0f2f62773..20f19106068 100644
--- 
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java
+++ 
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java
@@ -88,7 +88,7 @@ public abstract class BaseDMLE2EIT {
      * @throws IOException IO exception
      * @throws JAXBException JAXB exception
      */
-    public void init(final E2ETestParameter testParam, Map<String, DataSource> 
actualDataSourceMap) throws SQLException, IOException, JAXBException {
+    public void init(final E2ETestParameter testParam, final Map<String, 
DataSource> actualDataSourceMap) throws SQLException, IOException, 
JAXBException {
         dataSetEnvironmentManager = new DataSetEnvironmentManager(new 
ScenarioDataPath(testParam.getScenario()).getDataSetFile(Type.ACTUAL), 
actualDataSourceMap);
         dataSetEnvironmentManager.fillData();
     }
@@ -220,14 +220,6 @@ public abstract class BaseDMLE2EIT {
         assertRows(generatedKeys, 
containerComposer.getGeneratedKeyDataSet().getRows(), databaseType);
     }
     
-    protected void executeDestroySQLs(final SingleE2EContainerComposer 
containerComposer) throws SQLException {
-        if (null != containerComposer.getAssertion().getDestroySQL()) {
-            try (Connection connection = 
containerComposer.getTargetDataSource().getConnection()) {
-                executeDestroySQLs(containerComposer, connection);
-            }
-        }
-    }
-    
     protected void executeInitSQLs(final SingleE2EContainerComposer 
containerComposer) throws SQLException {
         if (null != containerComposer.getAssertion().getInitialSQL()) {
             try (Connection connection = 
containerComposer.getTargetDataSource().getConnection()) {
@@ -248,6 +240,14 @@ public abstract class BaseDMLE2EIT {
         }
     }
     
+    protected void executeDestroySQLs(final SingleE2EContainerComposer 
containerComposer) throws SQLException {
+        if (null != containerComposer.getAssertion().getDestroySQL()) {
+            try (Connection connection = 
containerComposer.getTargetDataSource().getConnection()) {
+                executeDestroySQLs(containerComposer, connection);
+            }
+        }
+    }
+    
     private void executeDestroySQLs(final SingleE2EContainerComposer 
containerComposer, final Connection connection) throws SQLException {
         if (null == containerComposer.getAssertion().getDestroySQL().getSql()) 
{
             return;

Reply via email to