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

jianglongtao 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 ce2d1cbf2cb Fix datasource is not closed after unregister storage unit 
(#33585)
ce2d1cbf2cb is described below

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

    Fix datasource is not closed after unregister storage unit (#33585)
---
 .../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 83e663dab17..9a9f11e2056 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
@@ -118,6 +118,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 56dc33523de..afc91244935 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
@@ -161,7 +161,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