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

menghaoran 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 e8a6956d313 Keep inused storage node when unregister storage unit 
(#31977)
e8a6956d313 is described below

commit e8a6956d313cc5cc48629eb8437b6e7392e7ffb3
Author: Raigor <[email protected]>
AuthorDate: Thu Jul 4 15:42:20 2024 +0800

    Keep inused storage node when unregister storage unit (#31977)
---
 .../mode/metadata/manager/ResourceSwitchManager.java   | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ResourceSwitchManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ResourceSwitchManager.java
index f805f64dc66..ad0cd0567e7 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ResourceSwitchManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/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;
@@ -118,16 +120,30 @@ public final class ResourceSwitchManager {
     
     private Map<StorageNode, DataSource> getToBeRemovedStaleDataSource(final 
ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) {
         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) {

Reply via email to