You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2024/07/04 07:42:26 UTC

(shardingsphere) branch master updated: Keep inused storage node when unregister storage unit (#31977)

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 <ra...@gmail.com>
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) {