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 <[email protected]>
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))));