This is an automated email from the ASF dual-hosted git repository. panjuan 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 04e74f2d703 Refactor ContextManager.alterResource() (#18978) 04e74f2d703 is described below commit 04e74f2d703ed75bca398a7e4956a465dc2a3a4c Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Sat Jul 9 21:58:50 2022 +0800 Refactor ContextManager.alterResource() (#18978) --- .../mode/manager/ContextManager.java | 54 +++------------------- 1 file changed, 6 insertions(+), 48 deletions(-) diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index 5f150b0c798..4ab18ead561 100644 --- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -26,9 +26,7 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey; import org.apache.shardingsphere.infra.database.type.DatabaseType; import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine; -import org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator; import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties; -import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator; import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine; import org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext; import org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContextFactory; @@ -53,7 +51,6 @@ import javax.sql.DataSource; import java.sql.SQLException; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; @@ -221,52 +218,13 @@ public final class ContextManager implements AutoCloseable { * @throws SQLException SQL exception */ public synchronized void alterResource(final String databaseName, final Map<String, DataSourceProperties> toBeAlteredDataSourcePropsMap) throws SQLException { - MetaDataContexts changedMetaDataContexts = buildChangedMetaDataContextWithAlteredDataSource(databaseName, toBeAlteredDataSourcePropsMap); - refreshMetaDataContext(databaseName, changedMetaDataContexts); - metaDataContexts.getPersistService().ifPresent(optional -> optional.getDataSourceService().append(databaseName, toBeAlteredDataSourcePropsMap)); - } - - private MetaDataContexts buildChangedMetaDataContextWithAlteredDataSource(final String databaseName, final Map<String, DataSourceProperties> alteredDataSourceProps) throws SQLException { - ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabases().get(databaseName); - Map<String, DataSource> pendingClosedDataSources = getChangedDataSources(database, alteredDataSourceProps); - Map<String, DataSourceProperties> pendingAlteredDataSourceProps = alteredDataSourceProps.entrySet().stream().filter(entry -> pendingClosedDataSources.containsKey(entry.getKey())) - .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); - pendingClosedDataSources.values().forEach(database.getResource()::close); - Map<String, DataSource> dataSourceMap = new HashMap<>(database.getResource().getDataSources()); - dataSourceMap.putAll(DataSourcePoolCreator.create(pendingAlteredDataSourceProps)); - ConfigurationProperties props = metaDataContexts.getMetaData().getProps(); - DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(dataSourceMap, database.getRuleMetaData().getConfigurations()); - Map<String, ShardingSphereDatabase> databases = ShardingSphereDatabasesFactory.create(Collections.singletonMap(database.getName(), databaseConfig), props, instanceContext); - ShardingSphereRuleMetaData globalMetaData = new ShardingSphereRuleMetaData( - GlobalRulesBuilder.buildRules(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(), databases, instanceContext)); - ShardingSphereMetaData metaData = new ShardingSphereMetaData(databases, globalMetaData, props); - MetaDataContexts result = newMetaDataContexts(metaData, OptimizerContextFactory.create(databases, globalMetaData)); - persistMetaData(result); - return result; - } - - private Map<String, DataSource> getChangedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) { - Collection<String> changedDataSourceNames = getChangedDataSourceProperties(database, dataSourcePropsMap).keySet(); - return database.getResource().getDataSources().entrySet().stream().filter(entry -> changedDataSourceNames.contains(entry.getKey())) - .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); - } - - private Map<String, DataSourceProperties> getChangedDataSourceProperties(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) { - return dataSourcePropsMap.entrySet().stream() - .filter(entry -> isModifiedDataSource(database.getResource().getDataSources(), entry.getKey(), entry.getValue())) - .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (oldValue, currentValue) -> oldValue, LinkedHashMap::new)); - } - - private boolean isModifiedDataSource(final Map<String, DataSource> originalDataSources, final String dataSourceName, final DataSourceProperties dataSourceProps) { - return originalDataSources.containsKey(dataSourceName) && !dataSourceProps.equals(DataSourcePropertiesCreator.create(originalDataSources.get(dataSourceName))); - } - - private void refreshMetaDataContext(final String databaseName, final MetaDataContexts changedMetaDataContexts) { - metaDataContexts.getMetaData().getDatabases().putAll(changedMetaDataContexts.getMetaData().getDatabases()); - metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().putAll(changedMetaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases()); - metaDataContexts.getOptimizerContext().getParserContexts().putAll(changedMetaDataContexts.getOptimizerContext().getParserContexts()); - metaDataContexts.getOptimizerContext().getPlannerContexts().putAll(changedMetaDataContexts.getOptimizerContext().getPlannerContexts()); + SwitchingResource switchingResource = new ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(), toBeAlteredDataSourcePropsMap); + metaDataContexts.getMetaData().getDatabases().putAll(createChangedDatabases(databaseName, switchingResource, null)); metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(metaDataContexts.getMetaData().getDatabases().get(databaseName))); + metaDataContexts.getOptimizerContext().alterDatabase(metaDataContexts.getMetaData().getDatabases().get(databaseName), metaDataContexts.getMetaData().getGlobalRuleMetaData()); + persistMetaData(metaDataContexts); + metaDataContexts.getPersistService().ifPresent(optional -> optional.getDataSourceService().append(databaseName, toBeAlteredDataSourcePropsMap)); + switchingResource.closeStaleDataSources(); } /**