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 47440f329166b3c7404d8cdfd785dcdf5ff7104b Author: Haoran Meng <[email protected]> AuthorDate: Fri Nov 1 22:32:20 2024 +0800 Support change in runtime for alter storage unit --- .../ClusterMetaDataManagerPersistService.java | 26 +++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) 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 de9a0566fa3..a2e915c4b84 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 @@ -24,6 +24,8 @@ import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigura 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.datasource.pool.props.domain.synonym.ConnectionPropertySynonyms; +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.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; @@ -141,6 +143,11 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag @Override public void alterStorageUnits(final String databaseName, final Map<String, DataSourcePoolProperties> toBeUpdatedProps) throws SQLException { MetaDataContexts originalMetaDataContexts = metaDataContextManager.getMetaDataContexts().get(); + DataSourceUnitPersistService dataSourceService = metaDataPersistService.getDataSourceUnitService(); + if (canBeChangedInRuntime(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeUpdatedProps)) { + metaDataPersistService.getMetaDataVersionPersistService().switchActiveVersion(dataSourceService.persist(databaseName, toBeUpdatedProps)); + return; + } @SphereEx(Type.MODIFY) boolean isInstanceConnectionEnabled = originalMetaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED); Map<StorageNode, DataSource> newDataSources = new HashMap<>(toBeUpdatedProps.size()); @@ -151,7 +158,6 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag 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); @@ -175,6 +181,24 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag } } + @SphereEx + private boolean canBeChangedInRuntime(final ResourceMetaData resourceMetaData, final Map<String, DataSourcePoolProperties> propsMap) { + for (Map.Entry<String, DataSourcePoolProperties> entry : propsMap.entrySet()) { + if (!resourceMetaData.getStorageUnits().containsKey(entry.getKey())) { + continue; + } + if (!entry.getValue().getCustomProperties().getProperties().containsKey("alterInRuntime")) { + return false; + } + ConnectionPropertySynonyms currentConnectionProps = resourceMetaData.getStorageUnits().get(entry.getKey()).getDataSourcePoolProperties().getConnectionPropertySynonyms(); + ConnectionPropertySynonyms newConnectionProps = entry.getValue().getConnectionPropertySynonyms(); + if (!currentConnectionProps.getStandardProperties().get("url").equals(newConnectionProps.getStandardProperties().get("url"))) { + return false; + } + } + return true; + } + @SphereEx private void closeNewDataSources(final Map<StorageNode, DataSource> newDataSources) { for (Map.Entry<StorageNode, DataSource> entry : newDataSources.entrySet()) {
