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

sunnianjun 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 187c195796b Use MetaDataContextFactory to rebuild meta data context 
for DatabaseRuleConfigurationManager (#32318)
187c195796b is described below

commit 187c195796b6aae03bf72db474a37f3228997046
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Jul 29 15:03:15 2024 +0800

    Use MetaDataContextFactory to rebuild meta data context for 
DatabaseRuleConfigurationManager (#32318)
    
    * Use MetaDataContextFactory to rebuild meta data context for 
DatabaseRuleConfigurationManager
    
    * Use MetaDataContextFactory to rebuild meta data context for 
DatabaseRuleConfigurationManager
---
 .../mode/metadata/MetaDataContextsFactory.java     | 23 ++++++
 .../manager/DatabaseRuleConfigurationManager.java  | 91 +---------------------
 2 files changed, 25 insertions(+), 89 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
index 338b12a6b34..94262ac18ae 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
@@ -224,6 +224,29 @@ public final class MetaDataContextsFactory {
         return create(metaDataPersistService, new 
ShardingSphereMetaData(changedDatabases, 
orginalMetaDataContexts.getMetaData().getGlobalResourceMetaData(), 
changedGlobalMetaData, props));
     }
     
+    /**
+     * Create meta data contexts by alter rule.
+     *
+     * @param databaseName database name
+     * @param internalLoadMetaData internal load meta data
+     * @param ruleConfigs rule configs
+     * @param orginalMetaDataContexts original meta data contexts
+     * @param metaDataPersistService meta data persist service
+     * @param computeNodeInstanceContext compute node instance context
+     * @return meta data contexts
+     * @throws SQLException SQL exception
+     */
+    public static MetaDataContexts createByAlterRule(final String 
databaseName, final boolean internalLoadMetaData, final 
Collection<RuleConfiguration> ruleConfigs,
+                                                     final MetaDataContexts 
orginalMetaDataContexts, final MetaDataPersistService metaDataPersistService,
+                                                     final 
ComputeNodeInstanceContext computeNodeInstanceContext) throws SQLException {
+        Map<String, ShardingSphereDatabase> changedDatabases =
+                createChangedDatabases(databaseName, internalLoadMetaData, 
null, ruleConfigs, orginalMetaDataContexts, metaDataPersistService, 
computeNodeInstanceContext);
+        ConfigurationProperties props = 
orginalMetaDataContexts.getMetaData().getProps();
+        RuleMetaData changedGlobalMetaData = new RuleMetaData(
+                
GlobalRulesBuilder.buildRules(orginalMetaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(),
 changedDatabases, props));
+        return create(metaDataPersistService, new 
ShardingSphereMetaData(changedDatabases, 
orginalMetaDataContexts.getMetaData().getGlobalResourceMetaData(), 
changedGlobalMetaData, props));
+    }
+    
     /**
      * Create changed databases by switch resource.
      *
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
index 224e8cdedf5..665fc12296c 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
@@ -18,39 +18,26 @@
 package org.apache.shardingsphere.mode.metadata.manager;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
-import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
-import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.PartialRuleUpdateSupported;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
-import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
-import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
 
 /**
  * Database rule configuration manager.
@@ -120,89 +107,15 @@ public final class DatabaseRuleConfigurationManager {
     private void refreshMetadata(final String databaseName, final 
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules) 
throws SQLException {
         database.getRuleMetaData().getRules().clear();
         database.getRuleMetaData().getRules().addAll(rules);
-        MetaDataContexts reloadMetaDataContexts = 
createMetaDataContextsByAlterRule(databaseName, 
database.getRuleMetaData().getConfigurations());
+        MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createByAlterRule(databaseName, false,
+                database.getRuleMetaData().getConfigurations(), 
metaDataContexts.get(), metaDataPersistService, computeNodeInstanceContext);
         metaDataContexts.set(reloadMetaDataContexts);
         
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(buildShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
     }
     
-    private MetaDataContexts createMetaDataContextsByAlterRule(final String 
databaseName, final Collection<RuleConfiguration> ruleConfigs) throws 
SQLException {
-        Map<String, ShardingSphereDatabase> changedDatabases = 
createChangedDatabases(databaseName, false, null, ruleConfigs);
-        return newMetaDataContexts(new 
ShardingSphereMetaData(changedDatabases, 
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
-                metaDataContexts.get().getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.get().getMetaData().getProps()));
-    }
-    
-    private ResourceMetaData getEffectiveResourceMetaData(final 
ShardingSphereDatabase database, final SwitchingResource resource) {
-        Map<StorageNode, DataSource> storageNodes = 
getStorageNodes(database.getResourceMetaData().getDataSources(), resource);
-        Map<String, StorageUnit> storageUnits = 
getStorageUnits(database.getResourceMetaData().getStorageUnits(), resource);
-        return new ResourceMetaData(storageNodes, storageUnits);
-    }
-    
-    private Map<StorageNode, DataSource> getStorageNodes(final 
Map<StorageNode, DataSource> currentStorageNodes, final SwitchingResource 
resource) {
-        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(currentStorageNodes.size(), 1F);
-        for (Entry<StorageNode, DataSource> entry : 
currentStorageNodes.entrySet()) {
-            if (null == resource || 
!resource.getStaleDataSources().containsKey(entry.getKey())) {
-                result.put(entry.getKey(), entry.getValue());
-            }
-        }
-        return result;
-    }
-    
-    private Map<String, StorageUnit> getStorageUnits(final Map<String, 
StorageUnit> currentStorageUnits, final SwitchingResource resource) {
-        Map<String, StorageUnit> result = new 
LinkedHashMap<>(currentStorageUnits.size(), 1F);
-        for (Entry<String, StorageUnit> entry : 
currentStorageUnits.entrySet()) {
-            if (null == resource || 
!resource.getStaleStorageUnitNames().contains(entry.getKey())) {
-                result.put(entry.getKey(), entry.getValue());
-            }
-        }
-        return result;
-    }
-    
-    private synchronized Map<String, ShardingSphereDatabase> 
createChangedDatabases(final String databaseName, final boolean 
internalLoadMetaData,
-                                                                               
     final SwitchingResource switchingResource, final 
Collection<RuleConfiguration> ruleConfigs) throws SQLException {
-        ResourceMetaData effectiveResourceMetaData = 
getEffectiveResourceMetaData(metaDataContexts.get().getMetaData().getDatabase(databaseName),
 switchingResource);
-        Collection<RuleConfiguration> toBeCreatedRuleConfigs = null == 
ruleConfigs
-                ? 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations()
-                : ruleConfigs;
-        DatabaseConfiguration toBeCreatedDatabaseConfig = 
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource, 
toBeCreatedRuleConfigs);
-        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
 internalLoadMetaData,
-                metaDataPersistService, toBeCreatedDatabaseConfig, 
metaDataContexts.get().getMetaData().getProps(), computeNodeInstanceContext);
-        Map<String, ShardingSphereDatabase> result = new 
LinkedHashMap<>(metaDataContexts.get().getMetaData().getDatabases());
-        result.put(databaseName.toLowerCase(), changedDatabase);
-        return result;
-    }
-    
-    private DatabaseConfiguration getDatabaseConfiguration(final 
ResourceMetaData resourceMetaData, final SwitchingResource switchingResource,
-                                                           final 
Collection<RuleConfiguration> toBeCreatedRuleConfigs) {
-        Map<String, DataSourcePoolProperties> propsMap = null == 
switchingResource
-                ? resourceMetaData.getStorageUnits().entrySet().stream()
-                        .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) -> 
oldValue, LinkedHashMap::new))
-                : switchingResource.getMergedDataSourcePoolPropertiesMap();
-        return new 
DataSourceProvidedDatabaseConfiguration(getMergedStorageNodeDataSources(resourceMetaData,
 switchingResource), toBeCreatedRuleConfigs, propsMap);
-    }
-    
-    private Map<StorageNode, DataSource> getMergedStorageNodeDataSources(final 
ResourceMetaData currentResourceMetaData, final SwitchingResource 
switchingResource) {
-        Map<StorageNode, DataSource> result = 
currentResourceMetaData.getDataSources();
-        if (null != switchingResource && 
!switchingResource.getNewDataSources().isEmpty()) {
-            result.putAll(switchingResource.getNewDataSources());
-        }
-        return result;
-    }
-    
-    private ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean internalLoadMetaData, final MetaDataPersistService 
persistService,
-                                                         final 
DatabaseConfiguration databaseConfig, final ConfigurationProperties props,
-                                                         final 
ComputeNodeInstanceContext computeNodeInstanceContext) throws SQLException {
-        return internalLoadMetaData
-                ? InternalMetaDataFactory.create(databaseName, persistService, 
databaseConfig, props, computeNodeInstanceContext)
-                : ExternalMetaDataFactory.create(databaseName, databaseConfig, 
props, computeNodeInstanceContext);
-    }
-    
     private Map<String, ShardingSphereSchema> buildShardingSphereSchemas(final 
ShardingSphereDatabase database) {
         Map<String, ShardingSphereSchema> result = new 
LinkedHashMap<>(database.getSchemas().size(), 1F);
         database.getSchemas().forEach((key, value) -> result.put(key, new 
ShardingSphereSchema(value.getTables(), value.getViews())));
         return result;
     }
-    
-    private MetaDataContexts newMetaDataContexts(final ShardingSphereMetaData 
metaData) {
-        return MetaDataContextsFactory.create(metaDataPersistService, 
metaData);
-    }
 }

Reply via email to