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 7b216a1f86f9a8803fe5a7418dd163d6332c263e
Author: Haoran Meng <[email protected]>
AuthorDate: Fri Nov 1 17:09:58 2024 +0800

    Close temporary data source when register and alter storage unit
---
 .../ClusterMetaDataManagerPersistService.java      | 67 ++++++++++++++--------
 1 file changed, 44 insertions(+), 23 deletions(-)

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 01ce73b3e7f..de9a0566fa3 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
@@ -22,7 +22,9 @@ import com.sphereex.dbplusengine.SphereEx.Type;
 import org.apache.groovy.util.Maps;
 import 
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
@@ -43,12 +45,10 @@ import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistServ
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
 
+import javax.sql.DataSource;
 import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 /**
@@ -122,14 +122,20 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
         @SphereEx(Type.MODIFY)
         boolean isInstanceConnectionEnabled = 
originalMetaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
-        @SphereEx(Type.MODIFY)
-        SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
-                
.switchByRegisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisteredProps, isInstanceConnectionEnabled);
-        MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
-                switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
-        
metaDataPersistService.getDataSourceUnitService().persist(databaseName, 
toBeRegisteredProps);
-        afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
-        reloadMetaDataContexts.close();
+        Map<StorageNode, DataSource> newDataSources = new 
HashMap<>(toBeRegisteredProps.size());
+        try {
+            @SphereEx(Type.MODIFY)
+            SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
+                    
.switchByRegisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisteredProps, isInstanceConnectionEnabled);
+            newDataSources.putAll(switchingResource.getNewDataSources());
+            MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+                    switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+            
metaDataPersistService.getDataSourceUnitService().persist(databaseName, 
toBeRegisteredProps);
+            afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
+            reloadMetaDataContexts.close();
+        } finally {
+            closeNewDataSources(newDataSources);
+        }
     }
     
     @Override
@@ -137,16 +143,22 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
         @SphereEx(Type.MODIFY)
         boolean isInstanceConnectionEnabled = 
originalMetaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
-        @SphereEx(Type.MODIFY)
-        SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
-                
.switchByAlterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps, isInstanceConnectionEnabled);
-        MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
-                switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
-        DataSourceUnitPersistService dataSourceService = 
metaDataPersistService.getDataSourceUnitService();
-        metaDataPersistService.getMetaDataVersionPersistService()
-                .switchActiveVersion(dataSourceService.persist(databaseName, 
toBeUpdatedProps));
-        afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
-        reloadMetaDataContexts.close();
+        Map<StorageNode, DataSource> newDataSources = new 
HashMap<>(toBeUpdatedProps.size());
+        try {
+            @SphereEx(Type.MODIFY)
+            SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
+                    
.switchByAlterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps, isInstanceConnectionEnabled);
+            newDataSources.putAll(switchingResource.getNewDataSources());
+            MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+                    switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+            DataSourceUnitPersistService dataSourceService = 
metaDataPersistService.getDataSourceUnitService();
+            metaDataPersistService.getMetaDataVersionPersistService()
+                    
.switchActiveVersion(dataSourceService.persist(databaseName, toBeUpdatedProps));
+            afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
+            reloadMetaDataContexts.close();
+        } finally {
+            closeNewDataSources(newDataSources);
+        }
     }
     
     @Override
@@ -162,6 +174,15 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
             reloadMetaDataContexts.close();
         }
     }
+
+    @SphereEx
+    private void closeNewDataSources(final Map<StorageNode, DataSource> 
newDataSources) {
+        for (Map.Entry<StorageNode, DataSource> entry : 
newDataSources.entrySet()) {
+            if (null != entry.getValue()) {
+                new DataSourcePoolDestroyer(entry.getValue()).asyncDestroy();
+            }
+        }
+    }
     
     private Collection<String> getToBeDroppedResourceNames(final String 
databaseName, final Collection<String> toBeDroppedResourceNames) {
         Map<String, DataSourcePoolProperties> propsMap = 
metaDataPersistService.getDataSourceUnitService().load(databaseName);

Reply via email to