This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 d34e3651041 Refactor ContextManager.addResource (#18938)
d34e3651041 is described below
commit d34e3651041d90c5eb2e2c93aae0ff3f00fa6384
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jul 7 19:16:53 2022 +0800
Refactor ContextManager.addResource (#18938)
---
.../optimizer/context/OptimizerContext.java | 14 ++++++++++++++
.../mode/manager/ContextManager.java | 22 +++++-----------------
2 files changed, 19 insertions(+), 17 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
index cd2ad256466..398137ba4d5 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
@@ -26,6 +26,8 @@ import
org.apache.shardingsphere.infra.federation.optimizer.context.planner.Opti
import
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
import
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
import
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -60,6 +62,18 @@ public final class OptimizerContext {
plannerContexts.put(databaseName,
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
}
+ /**
+ * Alter database.
+ *
+ * @param database to be altered database
+ * @param globalRuleMetaData global rule meta data
+ */
+ public void alterDatabase(final ShardingSphereDatabase database, final
ShardingSphereRuleMetaData globalRuleMetaData) {
+ OptimizerContext toBeAlteredOptimizerContext =
OptimizerContextFactory.create(Collections.singletonMap(database.getName(),
database), globalRuleMetaData);
+ federationMetaData.getDatabases().put(database.getName(),
toBeAlteredOptimizerContext.getFederationMetaData().getDatabases().get(database.getName()));
+ plannerContexts.put(database.getName(),
toBeAlteredOptimizerContext.getPlannerContexts().get(database.getName()));
+ }
+
/**
* Drop database.
*
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 37d63d132ab..90ea3c56726 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
@@ -205,26 +205,14 @@ public final class ContextManager implements
AutoCloseable {
* @throws SQLException SQL exception
*/
public synchronized void addResource(final String databaseName, final
Map<String, DataSourceProperties> toBeAddedDataSourcePropsMap) throws
SQLException {
- MetaDataContexts changedMetaDataContexts =
buildChangedMetaDataContextWithAddedDataSource(databaseName,
toBeAddedDataSourcePropsMap);
- refreshMetaDataContext(databaseName, changedMetaDataContexts);
+ SwitchingResource switchingResource = new
ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(),
toBeAddedDataSourcePropsMap);
+
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,
toBeAddedDataSourcePropsMap));
}
- 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());
-
dataSourceMap.putAll(DataSourcePoolCreator.create(addedDataSourceProps));
- 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;
- }
-
/**
* Alter resource.
*