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))));

Reply via email to