You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/07/04 20:21:36 UTC
[shardingsphere] branch master updated: Reuse ResourceSwitchManager in ContextManager.alterDataSourceAndRuleConfiguration() (#18838)
This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 cd2d1b19a20 Reuse ResourceSwitchManager in ContextManager.alterDataSourceAndRuleConfiguration() (#18838)
cd2d1b19a20 is described below
commit cd2d1b19a20b638a77a05c2adeb27d0e4d41f63a
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Tue Jul 5 04:21:22 2022 +0800
Reuse ResourceSwitchManager in ContextManager.alterDataSourceAndRuleConfiguration() (#18838)
---
.../mode/manager/ContextManager.java | 172 ++++++++-------------
1 file changed, 68 insertions(+), 104 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 1d1bf3f4268..bd73b765c6d 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
@@ -58,7 +58,6 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Optional;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
@@ -248,7 +247,7 @@ public final class ContextManager implements AutoCloseable {
public void alterRuleConfiguration(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) {
try {
Collection<ResourceHeldRule> staleResourceHeldRules = getStaleResourceHeldRules(databaseName);
- metaDataContexts = createMetaDataContextsWithAlteredDatabaseRules(databaseName, ruleConfigs);
+ metaDataContexts = createMetaDataContexts(databaseName, ruleConfigs);
persistMetaData(metaDataContexts);
staleResourceHeldRules.forEach(ResourceHeldRule::closeStaleResources);
} catch (final SQLException ex) {
@@ -256,32 +255,6 @@ public final class ContextManager implements AutoCloseable {
}
}
- @SuppressWarnings("rawtypes")
- private Collection<ResourceHeldRule> getStaleResourceHeldRules(final String databaseName) {
- Collection<ResourceHeldRule> result = new LinkedList<>();
- result.addAll(metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData().findRules(ResourceHeldRule.class));
- result.addAll(metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class));
- return result;
- }
-
- private MetaDataContexts createMetaDataContextsWithAlteredDatabaseRules(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
- Map<String, ShardingSphereDatabase> changedDatabases = createChangedDatabasesWithAlteredDatabaseRules(databaseName, ruleConfigs);
- ShardingSphereRuleMetaData changedGlobalMetaData = new ShardingSphereRuleMetaData(
- GlobalRulesBuilder.buildRules(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(), changedDatabases, instanceContext));
- return new MetaDataContexts(metaDataContexts.getPersistService().orElse(null),
- new ShardingSphereMetaData(changedDatabases, changedGlobalMetaData, metaDataContexts.getMetaData().getProps()),
- OptimizerContextFactory.create(changedDatabases, changedGlobalMetaData));
- }
-
- private Map<String, ShardingSphereDatabase> createChangedDatabasesWithAlteredDatabaseRules(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
- ShardingSphereDatabase changedDatabase = ShardingSphereDatabasesFactory.create(databaseName,
- new DataSourceProvidedDatabaseConfiguration(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource().getDataSources(), ruleConfigs),
- metaDataContexts.getMetaData().getProps(), instanceContext);
- Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(metaDataContexts.getMetaData().getDatabases());
- result.put(databaseName, changedDatabase);
- return result;
- }
-
/**
* Alter data source configuration.
*
@@ -293,7 +266,7 @@ public final class ContextManager implements AutoCloseable {
try {
Collection<ResourceHeldRule> staleResourceHeldRules = getStaleResourceHeldRules(databaseName);
SwitchingResource switchingResource = new ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(), dataSourcePropsMap);
- metaDataContexts = createMetaDataContextsWithAlteredResources(databaseName, switchingResource);
+ metaDataContexts = createMetaDataContexts(databaseName, switchingResource);
persistMetaData(metaDataContexts);
staleResourceHeldRules.forEach(ResourceHeldRule::closeStaleResources);
switchingResource.closeStaleDataSources();
@@ -302,8 +275,55 @@ public final class ContextManager implements AutoCloseable {
}
}
- private MetaDataContexts createMetaDataContextsWithAlteredResources(final String databaseName, final SwitchingResource switchingResource) throws SQLException {
- Map<String, ShardingSphereDatabase> changedDatabases = createChangedDatabasesWithAlteredResources(databaseName, switchingResource);
+ /**
+ * Alter data source and rule configuration.
+ *
+ * @param databaseName database name
+ * @param dataSourcePropsMap data source props map
+ * @param ruleConfigs rule configurations
+ */
+ @SuppressWarnings("rawtypes")
+ public void alterDataSourceAndRuleConfiguration(final String databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap, final Collection<RuleConfiguration> ruleConfigs) {
+ try {
+ Collection<ResourceHeldRule> staleResourceHeldRules = getStaleResourceHeldRules(databaseName);
+ SwitchingResource switchingResource = new ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(), dataSourcePropsMap);
+ metaDataContexts = createMetaDataContexts(databaseName, switchingResource, ruleConfigs);
+ persistMetaData(metaDataContexts);
+ staleResourceHeldRules.forEach(ResourceHeldRule::closeStaleResources);
+ switchingResource.closeStaleDataSources();
+ } catch (SQLException ex) {
+ log.error("Alter database:{} data source and rule configuration failed", databaseName, ex);
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ private Collection<ResourceHeldRule> getStaleResourceHeldRules(final String databaseName) {
+ Collection<ResourceHeldRule> result = new LinkedList<>();
+ result.addAll(metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData().findRules(ResourceHeldRule.class));
+ result.addAll(metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class));
+ return result;
+ }
+
+ private MetaDataContexts createMetaDataContexts(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
+ Map<String, ShardingSphereDatabase> changedDatabases = createChangedDatabases(databaseName, ruleConfigs);
+ ShardingSphereRuleMetaData changedGlobalMetaData = new ShardingSphereRuleMetaData(
+ GlobalRulesBuilder.buildRules(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(), changedDatabases, instanceContext));
+ return new MetaDataContexts(metaDataContexts.getPersistService().orElse(null),
+ new ShardingSphereMetaData(changedDatabases, changedGlobalMetaData, metaDataContexts.getMetaData().getProps()),
+ OptimizerContextFactory.create(changedDatabases, changedGlobalMetaData));
+ }
+
+ private MetaDataContexts createMetaDataContexts(final String databaseName, final SwitchingResource switchingResource) throws SQLException {
+ Map<String, ShardingSphereDatabase> changedDatabases = createChangedDatabases(databaseName, switchingResource);
+ ShardingSphereRuleMetaData changedGlobalMetaData = new ShardingSphereRuleMetaData(
+ GlobalRulesBuilder.buildRules(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(), changedDatabases, instanceContext));
+ return new MetaDataContexts(metaDataContexts.getPersistService().orElse(null),
+ new ShardingSphereMetaData(changedDatabases, changedGlobalMetaData, metaDataContexts.getMetaData().getProps()),
+ OptimizerContextFactory.create(changedDatabases, changedGlobalMetaData));
+ }
+
+ private MetaDataContexts createMetaDataContexts(final String databaseName, final SwitchingResource switchingResource, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
+ Map<String, ShardingSphereDatabase> changedDatabases = createChangedDatabases(databaseName, switchingResource, ruleConfigs);
ShardingSphereRuleMetaData changedGlobalMetaData = new ShardingSphereRuleMetaData(
GlobalRulesBuilder.buildRules(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(), changedDatabases, instanceContext));
return new MetaDataContexts(metaDataContexts.getPersistService().orElse(null),
@@ -311,7 +331,16 @@ public final class ContextManager implements AutoCloseable {
OptimizerContextFactory.create(changedDatabases, changedGlobalMetaData));
}
- private Map<String, ShardingSphereDatabase> createChangedDatabasesWithAlteredResources(final String databaseName, final SwitchingResource switchingResource) throws SQLException {
+ private Map<String, ShardingSphereDatabase> createChangedDatabases(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
+ ShardingSphereDatabase changedDatabase = ShardingSphereDatabasesFactory.create(databaseName,
+ new DataSourceProvidedDatabaseConfiguration(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource().getDataSources(), ruleConfigs),
+ metaDataContexts.getMetaData().getProps(), instanceContext);
+ Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(metaDataContexts.getMetaData().getDatabases());
+ result.put(databaseName, changedDatabase);
+ return result;
+ }
+
+ private Map<String, ShardingSphereDatabase> createChangedDatabases(final String databaseName, final SwitchingResource switchingResource) throws SQLException {
DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(
switchingResource.getNewDataSources(), metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData().getConfigurations());
ShardingSphereDatabase changedDatabase = ShardingSphereDatabasesFactory.create(databaseName, databaseConfig, metaDataContexts.getMetaData().getProps(), instanceContext);
@@ -320,21 +349,13 @@ public final class ContextManager implements AutoCloseable {
return result;
}
- /**
- * Alter data source and rule configuration.
- *
- * @param databaseName database name
- * @param dataSourcePropsMap data source props map
- * @param ruleConfigs rule configurations
- */
- public void alterDataSourceAndRuleConfiguration(final String databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap, final Collection<RuleConfiguration> ruleConfigs) {
- try {
- MetaDataContexts changedMetaDataContext = buildChangedMetaDataContextWithChangedDataSourceAndRule(
- metaDataContexts.getMetaData().getDatabases().get(databaseName), dataSourcePropsMap, ruleConfigs);
- refreshMetaDataContext(databaseName, changedMetaDataContext, dataSourcePropsMap);
- } catch (SQLException ex) {
- log.error("Alter database:{} data source and rule configuration failed", databaseName, ex);
- }
+ private Map<String, ShardingSphereDatabase> createChangedDatabases(final String databaseName,
+ final SwitchingResource switchingResource, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
+ DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(switchingResource.getNewDataSources(), ruleConfigs);
+ ShardingSphereDatabase changedDatabase = ShardingSphereDatabasesFactory.create(databaseName, databaseConfig, metaDataContexts.getMetaData().getProps(), instanceContext);
+ Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(metaDataContexts.getMetaData().getDatabases());
+ result.put(databaseName, changedDatabase);
+ return result;
}
/**
@@ -490,18 +511,6 @@ public final class ContextManager implements AutoCloseable {
return result;
}
- private Collection<DataSource> getPendingClosedDataSources(final String databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap) {
- Collection<DataSource> result = new LinkedList<>();
- result.addAll(getDeletedDataSources(metaDataContexts.getMetaData().getDatabases().get(databaseName), dataSourcePropsMap).values());
- result.addAll(getChangedDataSources(metaDataContexts.getMetaData().getDatabases().get(databaseName), dataSourcePropsMap).values());
- return result;
- }
-
- private Map<String, DataSource> getDeletedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
- return database.getResource().getDataSources().entrySet().stream().filter(entry -> !dataSourcePropsMap.containsKey(entry.getKey()))
- .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
- }
-
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()))
@@ -550,19 +559,6 @@ public final class ContextManager implements AutoCloseable {
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(metaDataContexts.getMetaData().getDatabases().get(databaseName)));
}
- private void refreshMetaDataContext(final String databaseName, final MetaDataContexts changedMetaDataContexts, final Map<String, DataSourceProperties> dataSourcePropsMap) {
- metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().putAll(changedMetaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases());
- Map<String, ShardingSphereDatabase> databases = new HashMap<>(metaDataContexts.getMetaData().getDatabases());
- databases.putAll(changedMetaDataContexts.getMetaData().getDatabases());
- final Collection<DataSource> pendingClosedDataSources = getPendingClosedDataSources(databaseName, dataSourcePropsMap);
- MetaDataContexts newMetaDataContexts = rebuildMetaDataContexts(
- new ShardingSphereMetaData(databases, metaDataContexts.getMetaData().getGlobalRuleMetaData(), metaDataContexts.getMetaData().getProps()));
- metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(ResourceHeldRule::closeStaleResources);
- metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData().findRules(ResourceHeldRule.class).forEach(ResourceHeldRule::closeStaleResources);
- renewMetaDataContexts(newMetaDataContexts);
- pendingClosedDataSources.forEach(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource()::close);
- }
-
private MetaDataContexts buildChangedMetaDataContextWithAddedDataSource(final String databaseName, final Map<String, DataSourceProperties> addedDataSourceProps) throws SQLException {
ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabases().get(databaseName);
Map<String, DataSource> dataSourceMap = new HashMap<>(database.getResource().getDataSources());
@@ -597,38 +593,6 @@ public final class ContextManager implements AutoCloseable {
return result;
}
- private MetaDataContexts buildChangedMetaDataContextWithChangedDataSourceAndRule(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourceProps,
- final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
- 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(
- 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 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> 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> buildToBeChangedDataSources(final ShardingSphereDatabase database, final Map<String, DataSourceProperties> dataSourcePropsMap) {
- return DataSourcePoolCreator.create(getChangedDataSourceProperties(database, dataSourcePropsMap));
- }
-
private void persistMetaData(final MetaDataContexts metaDataContexts) {
metaDataContexts.getMetaData().getDatabases().forEach((databaseName, schemas) -> schemas.getSchemas()
.forEach((schemaName, tables) -> metaDataContexts.getPersistService().ifPresent(optional -> optional.getDatabaseMetaDataService().persistMetaData(databaseName, schemaName, tables))));