This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 f2b4b09  Refactor renew MetaDataContext (#12661)
f2b4b09 is described below

commit f2b4b0966b0be4875af7bab18c4e83b07b3f0b63
Author: Haoran Meng <[email protected]>
AuthorDate: Fri Sep 24 10:14:52 2021 +0800

    Refactor renew MetaDataContext (#12661)
---
 .../ClusterContextManagerCoordinator.java          | 59 +++++++++-------------
 1 file changed, 23 insertions(+), 36 deletions(-)

diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
index 4642b52..2101830 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
@@ -99,13 +99,10 @@ public final class ClusterContextManagerCoordinator {
     @Subscribe
     public synchronized void renew(final SchemaAddedEvent event) throws 
SQLException {
         persistSchema(event.getSchemaName());
-        ShardingSphereMetaData metaData = buildMetaData(event.getSchemaName());
-        
contextManager.getMetaDataContexts().getOptimizerContext().getMetaData().getSchemas().put(event.getSchemaName(),
 new FederationSchemaMetaData(event.getSchemaName(), 
-                metaData.getSchema().getTables()));
-        
contextManager.getMetaDataContexts().getMetaDataMap().put(event.getSchemaName(),
 metaData);
-        
contextManager.renewMetaDataContexts(rebuildMetaDataContexts(contextManager.getMetaDataContexts().getMetaDataMap()));
-        ShardingSphereEventBus.getInstance().post(new 
DataSourceChangeCompletedEvent(event.getSchemaName(),
-                
contextManager.getMetaDataContexts().getMetaDataMap().get(event.getSchemaName()).getResource().getDatabaseType(),
 metaData.getResource().getDataSources()));
+        MetaDataContexts metaDataContexts = 
buildNewMetaDataContext(event.getSchemaName());
+        
contextManager.getMetaDataContexts().getOptimizerContext().getMetaData().getSchemas().put(event.getSchemaName(),
 
+                
metaDataContexts.getOptimizerContext().getMetaData().getSchemas().get(event.getSchemaName()));
+        
contextManager.getMetaDataContexts().getMetaDataMap().put(event.getSchemaName(),
 metaDataContexts.getMetaData(event.getSchemaName()));
     }
     
     /**
@@ -176,10 +173,11 @@ public final class ClusterContextManagerCoordinator {
     @Subscribe
     public synchronized void renew(final RuleConfigurationsChangedEvent event) 
throws SQLException {
         String schemaName = event.getSchemaName();
-        ShardingSphereMetaData metaData = 
getChangedMetaData(contextManager.getMetaDataContexts().getMetaDataMap().get(schemaName),
 event.getRuleConfigurations());
-        Map<String, ShardingSphereMetaData> schemaMetaData = 
rebuildSchemaMetaData(schemaName, metaData);
-        
contextManager.renewMetaDataContexts(rebuildMetaDataContexts(schemaMetaData));
-        metaDataPersistService.getSchemaMetaDataService().persist(schemaName, 
schemaMetaData.get(schemaName).getSchema());
+        MetaDataContexts changedMetaDataContexts = 
buildChangedMetaDataContext(contextManager.getMetaDataContexts().getMetaDataMap().get(schemaName),
 event.getRuleConfigurations());
+        
contextManager.getMetaDataContexts().getOptimizerContext().getMetaData().getSchemas().putAll(changedMetaDataContexts.getOptimizerContext().getMetaData().getSchemas());
+        Map<String, ShardingSphereMetaData> metaDataMap = new 
HashMap<>(contextManager.getMetaDataContexts().getMetaDataMap());
+        metaDataMap.putAll(changedMetaDataContexts.getMetaDataMap());
+        
contextManager.renewMetaDataContexts(rebuildMetaDataContexts(metaDataMap));
     }
     
     /**
@@ -191,13 +189,15 @@ public final class ClusterContextManagerCoordinator {
     @Subscribe
     public synchronized void renew(final DataSourceChangedEvent event) throws 
SQLException {
         String schemaName = event.getSchemaName();
+        MetaDataContexts changedMetaDataContext = 
buildChangedMetaDataContext(contextManager.getMetaDataContexts().getMetaDataMap().get(schemaName),
 event.getDataSourceConfigurations());
+        
contextManager.getMetaDataContexts().getOptimizerContext().getMetaData().getSchemas().putAll(changedMetaDataContext.getOptimizerContext().getMetaData().getSchemas());
+        Map<String, ShardingSphereMetaData> metaDataMap = new 
HashMap<>(contextManager.getMetaDataContexts().getMetaDataMap());
+        metaDataMap.putAll(changedMetaDataContext.getMetaDataMap());
         Collection<DataSource> pendingClosedDataSources = 
getPendingClosedDataSources(schemaName, event.getDataSourceConfigurations());
-        ShardingSphereMetaData metaData = 
rebuildMetaData(contextManager.getMetaDataContexts().getMetaDataMap().get(schemaName),
 event.getDataSourceConfigurations());
-        Map<String, ShardingSphereMetaData> schemaMetaData = 
rebuildSchemaMetaData(schemaName, metaData);
-        
contextManager.renewMetaDataContexts(rebuildMetaDataContexts(schemaMetaData));
+        
contextManager.renewMetaDataContexts(rebuildMetaDataContexts(metaDataMap));
         ShardingSphereEventBus.getInstance().post(new 
DataSourceChangeCompletedEvent(event.getSchemaName(),
                 
contextManager.getMetaDataContexts().getMetaDataMap().get(event.getSchemaName()).getResource().getDatabaseType(),
 
-                
schemaMetaData.get(event.getSchemaName()).getResource().getDataSources()));
+                
changedMetaDataContext.getMetaData(event.getSchemaName()).getResource().getDataSources()));
         closeDataSources(schemaName, pendingClosedDataSources);
     }
     
@@ -269,13 +269,6 @@ public final class ClusterContextManagerCoordinator {
                 contextManager.getMetaDataContexts().getProps(), 
contextManager.getMetaDataContexts().getOptimizerContext());
     }
     
-    private Map<String, ShardingSphereMetaData> rebuildSchemaMetaData(final 
String schemaName, final ShardingSphereMetaData metaData) {
-        Map<String, ShardingSphereMetaData> result = new 
HashMap<>(contextManager.getMetaDataContexts().getMetaDataMap());
-        result.put(schemaName, metaData);
-        
contextManager.getMetaDataContexts().getOptimizerContext().getMetaData().getSchemas().put(schemaName,
 new FederationSchemaMetaData(schemaName, metaData.getSchema().getTables()));
-        return result;
-    }
-    
     private void persistSchema(final String schemaName) {
         if 
(!metaDataPersistService.getDataSourceService().isExisted(schemaName)) {
             metaDataPersistService.getDataSourceService().persist(schemaName, 
new LinkedHashMap<>());
@@ -285,30 +278,24 @@ public final class ClusterContextManagerCoordinator {
         }
     }
     
-    private ShardingSphereMetaData buildMetaData(final String schemaName) 
throws SQLException {
+    private MetaDataContexts buildNewMetaDataContext(final String schemaName) 
throws SQLException {
         Map<String, Map<String, DataSource>> dataSourcesMap = 
createDataSourcesMap(Collections.singletonMap(schemaName, 
metaDataPersistService.getDataSourceService().load(schemaName)));
         Map<String, Collection<RuleConfiguration>> schemaRuleConfigs = 
Collections.singletonMap(schemaName, 
metaDataPersistService.getSchemaRuleService().load(schemaName));
         Properties props = 
contextManager.getMetaDataContexts().getProps().getProps();
         Map<String, ShardingSphereSchema> schemas = new 
SchemaLoader(dataSourcesMap, schemaRuleConfigs, props).load();
-        return new MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, 
metaDataPersistService.getGlobalRuleService().load(), schemas, 
props).build(metaDataPersistService)
-                .getMetaData(schemaName);
-    }
-    
-    private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData originalMetaData, final ShardingSphereSchema schema, 
final String schemaName) {
-        // TODO refresh table addressing mapper
-        return new ShardingSphereMetaData(schemaName, 
originalMetaData.getResource(), originalMetaData.getRuleMetaData(), schema);
+        return new MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, 
metaDataPersistService.getGlobalRuleService().load(), schemas, 
props).build(metaDataPersistService);
     }
     
-    private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData originalMetaData, final Collection<RuleConfiguration> 
ruleConfigs) throws SQLException {
+    private MetaDataContexts buildChangedMetaDataContext(final 
ShardingSphereMetaData originalMetaData, final Collection<RuleConfiguration> 
ruleConfigs) throws SQLException {
         Map<String, Map<String, DataSource>> dataSourcesMap = 
Collections.singletonMap(originalMetaData.getName(), 
originalMetaData.getResource().getDataSources());
         Map<String, Collection<RuleConfiguration>> schemaRuleConfigs = 
Collections.singletonMap(originalMetaData.getName(), ruleConfigs);
         Properties props = 
contextManager.getMetaDataContexts().getProps().getProps();
         Map<String, ShardingSphereSchema> schemas = new 
SchemaLoader(dataSourcesMap, schemaRuleConfigs, props).load();
-        MetaDataContextsBuilder builder = new 
MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, 
metaDataPersistService.getGlobalRuleService().load(), schemas, props);
-        return 
builder.build(metaDataPersistService).getMetaDataMap().values().iterator().next();
+        
metaDataPersistService.getSchemaMetaDataService().persist(originalMetaData.getName(),
 schemas.get(originalMetaData.getSchema()));
+        return new MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, 
metaDataPersistService.getGlobalRuleService().load(), schemas, 
props).build(metaDataPersistService);
     }
     
-    private ShardingSphereMetaData rebuildMetaData(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> newDataSourceConfigs) throws SQLException {
+    private MetaDataContexts buildChangedMetaDataContext(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> newDataSourceConfigs) throws SQLException {
         Collection<String> deletedDataSources = 
getDeletedDataSources(originalMetaData, newDataSourceConfigs).keySet();
         Map<String, DataSource> changedDataSources = 
buildChangedDataSources(originalMetaData, newDataSourceConfigs);
         Map<String, Map<String, DataSource>> dataSourcesMap = 
Collections.singletonMap(originalMetaData.getName(),
@@ -316,8 +303,8 @@ public final class ClusterContextManagerCoordinator {
         Map<String, Collection<RuleConfiguration>> schemaRuleConfigs = 
Collections.singletonMap(originalMetaData.getName(), 
originalMetaData.getRuleMetaData().getConfigurations());
         Properties props = 
contextManager.getMetaDataContexts().getProps().getProps();
         Map<String, ShardingSphereSchema> schemas = new 
SchemaLoader(dataSourcesMap, schemaRuleConfigs, props).load();
-        return new MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, 
metaDataPersistService.getGlobalRuleService().load(), schemas, 
props).build(metaDataPersistService)
-                .getMetaData(originalMetaData.getName());
+        
metaDataPersistService.getSchemaMetaDataService().persist(originalMetaData.getName(),
 schemas.get(originalMetaData.getSchema()));
+        return new MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, 
metaDataPersistService.getGlobalRuleService().load(), schemas, 
props).build(metaDataPersistService);
     }
     
     private Map<String, DataSource> getNewDataSources(final Map<String, 
DataSource> originalDataSources,

Reply via email to