You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by to...@apache.org on 2022/07/03 15:59:55 UTC
[shardingsphere] branch master updated: Refactor ContextManager.alterDataSourceConfiguration (#18815)
This is an automated email from the ASF dual-hosted git repository.
totalo 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 9cca69ef024 Refactor ContextManager.alterDataSourceConfiguration (#18815)
9cca69ef024 is described below
commit 9cca69ef0244dde5a189a1c558239f6fbd979117
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Jul 3 23:59:44 2022 +0800
Refactor ContextManager.alterDataSourceConfiguration (#18815)
---
.../mode/manager/ContextManager.java | 62 ++++++++++------------
1 file changed, 28 insertions(+), 34 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 c0991a72bdb..099b23b7b44 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
@@ -273,13 +273,25 @@ public final class ContextManager implements AutoCloseable {
*/
public void alterDataSourceConfiguration(final String databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap) {
try {
- MetaDataContexts changedMetaDataContext = buildChangedMetaDataContextWithChangedDataSource(metaDataContexts.getMetaData().getDatabases().get(databaseName), dataSourcePropsMap);
+ MetaDataContexts changedMetaDataContext = createMetaDataContextsWithAlteredResources(databaseName, dataSourcePropsMap);
+ persistMetaData(changedMetaDataContext);
refreshMetaDataContext(databaseName, changedMetaDataContext, dataSourcePropsMap);
} catch (final SQLException ex) {
log.error("Alter database:{} data source configuration failed", databaseName, ex);
}
}
+ private MetaDataContexts createMetaDataContextsWithAlteredResources(final String databaseName, final Map<String, DataSourceProperties> dataSourceProps) throws SQLException {
+ ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabases().get(databaseName);
+ DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(getNewDataSources(database, dataSourceProps), database.getRuleMetaData().getConfigurations());
+ ConfigurationProperties props = metaDataContexts.getMetaData().getProps();
+ 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);
+ return new MetaDataContexts(metaDataContexts.getPersistService().orElse(null), metaData, OptimizerContextFactory.create(databases, globalMetaData));
+ }
+
/**
* Alter data source and rule configuration.
*
@@ -463,12 +475,12 @@ public final class ContextManager implements AutoCloseable {
}
private Map<String, DataSource> getChangedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
- Collection<String> changedDataSourceNames = getChangedDataSourceConfiguration(database, dataSourcePropsMap).keySet();
+ Collection<String> changedDataSourceNames = getChangedDataSourceProperties(database, dataSourcePropsMap).keySet();
return database.getResource().getDataSources().entrySet().stream().filter(entry -> changedDataSourceNames.contains(entry.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
- private Map<String, DataSourceProperties> getChangedDataSourceConfiguration(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
+ 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(Map.Entry::getKey, Map.Entry::getValue, (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
@@ -557,28 +569,9 @@ public final class ContextManager implements AutoCloseable {
return result;
}
- private MetaDataContexts buildChangedMetaDataContextWithChangedDataSource(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourceProps) throws SQLException {
- Collection<String> deletedDataSources = getDeletedDataSources(database, dataSourceProps).keySet();
- Map<String, DataSource> changedDataSources = buildChangedDataSources(database, dataSourceProps);
- DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(
- getNewDataSources(database.getResource().getDataSources(), getAddedDataSources(database, dataSourceProps), changedDataSources, deletedDataSources),
- database.getRuleMetaData().getConfigurations());
- ConfigurationProperties props = metaDataContexts.getMetaData().getProps();
- 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 = new MetaDataContexts(metaDataContexts.getPersistService().orElse(null), metaData, OptimizerContextFactory.create(databases, globalMetaData));
- persistMetaData(result);
- return result;
- }
-
private MetaDataContexts buildChangedMetaDataContextWithChangedDataSourceAndRule(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourceProps,
final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
- Collection<String> deletedDataSources = getDeletedDataSources(database, dataSourceProps).keySet();
- Map<String, DataSource> changedDataSources = buildChangedDataSources(database, dataSourceProps);
- DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(getNewDataSources(database.getResource().getDataSources(),
- getAddedDataSources(database, dataSourceProps), changedDataSources, deletedDataSources), ruleConfigs);
+ DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(getNewDataSources(database, dataSourceProps), ruleConfigs);
ConfigurationProperties props = metaDataContexts.getMetaData().getProps();
Map<String, ShardingSphereDatabase> databases = ShardingSphereDatabasesFactory.create(Collections.singletonMap(database.getName(), databaseConfig), props, instanceContext);
ShardingSphereRuleMetaData globalMetaData = new ShardingSphereRuleMetaData(
@@ -589,22 +582,23 @@ public final class ContextManager implements AutoCloseable {
return result;
}
- private Map<String, DataSource> getNewDataSources(final Map<String, DataSource> originalDataSources,
- final Map<String, DataSource> addedDataSources, final Map<String, DataSource> changedDataSources, final Collection<String> deletedDataSources) {
- Map<String, DataSource> result = new LinkedHashMap<>(originalDataSources);
- result.keySet().removeAll(deletedDataSources);
- result.putAll(changedDataSources);
- result.putAll(addedDataSources);
+ private Map<String, DataSource> getNewDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> toBeChangedDataSourceProps) {
+ Map<String, DataSource> result = new LinkedHashMap<>(database.getResource().getDataSources());
+ result.keySet().removeAll(getDeletedDataSources(database, toBeChangedDataSourceProps).keySet());
+ result.putAll(buildToBeChangedDataSources(database, toBeChangedDataSourceProps));
+ // TODO close stale data sources
+ result.putAll(buildToBeAddedDataSources(database, toBeChangedDataSourceProps));
return result;
}
- private Map<String, DataSource> getAddedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
- return DataSourcePoolCreator.create(dataSourcePropsMap.entrySet().stream()
- .filter(entry -> !database.getResource().getDataSources().containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey, Entry::getValue)));
+ private Map<String, DataSource> buildToBeAddedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
+ Map<String, DataSourceProperties> toBeAddedDataSourceProps = dataSourcePropsMap.entrySet().stream()
+ .filter(entry -> !database.getResource().getDataSources().containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
+ return DataSourcePoolCreator.create(toBeAddedDataSourceProps);
}
- private Map<String, DataSource> buildChangedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
- return DataSourcePoolCreator.create(getChangedDataSourceConfiguration(database, dataSourcePropsMap));
+ private Map<String, DataSource> buildToBeChangedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
+ return DataSourcePoolCreator.create(getChangedDataSourceProperties(database, dataSourcePropsMap));
}
private void persistMetaData(final MetaDataContexts metaDataContexts) {