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

jiangmaolin pushed a commit to branch dev-5.5.1
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git

commit becb9e1d4c9359300704898bd4422af70912b2d5
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Nov 7 17:57:43 2024 +0800

    Fix datasource is not closed after unregister storage unit (#33585)
    
    (cherry picked from commit ce2d1cbf2cb52c06f59799fc3c217eb5a268c349)
---
 .../mode/metadata/manager/ResourceSwitchManager.java      | 15 +++++++++++++++
 .../persist/ClusterMetaDataManagerPersistService.java     |  2 +-
 2 files changed, 16 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 03eecd368ed..ade852c8c18 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
@@ -130,6 +130,21 @@ public final class ResourceSwitchManager {
         return result;
     }
     
+    /**
+     * create switching resource by unregister storage unit.
+     *
+     * @param resourceMetaData resource meta data
+     * @param storageUnitNames storage unit names
+     * @return created switching resource
+     */
+    public SwitchingResource createByUnregisterStorageUnit(final 
ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) {
+        Map<String, DataSourcePoolProperties> 
mergedDataSourcePoolPropertiesMap = new 
LinkedHashMap<>(resourceMetaData.getStorageUnits().entrySet().stream()
+                .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) -> 
oldValue, LinkedHashMap::new)));
+        storageUnitNames.forEach(mergedDataSourcePoolPropertiesMap::remove);
+        return new SwitchingResource(Collections.emptyMap(),
+                getToBeRemovedStaleDataSource(resourceMetaData, 
storageUnitNames), storageUnitNames, mergedDataSourcePoolPropertiesMap);
+    }
+    
     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);
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
index a2e915c4b84..cbe81caa91a 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
@@ -172,7 +172,7 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         for (String each : getToBeDroppedResourceNames(databaseName, 
toBeDroppedStorageUnitNames)) {
             MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
             SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
-                    
.switchByUnregisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 Collections.singletonList(each));
+                    
.createByUnregisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 Collections.singletonList(each));
             MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
                     switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
             
metaDataPersistService.getDataSourceUnitService().delete(databaseName, each);

Reply via email to