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);
