You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2022/01/30 04:52:41 UTC

[shardingsphere] branch master updated: Refactor ClusterContextManagerBuilder (#15205)

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 c32e923  Refactor ClusterContextManagerBuilder (#15205)
c32e923 is described below

commit c32e9238f76a4cf23a91dbaaee6127af8ab624ea
Author: Liang Zhang <te...@163.com>
AuthorDate: Sun Jan 30 12:51:52 2022 +0800

    Refactor ClusterContextManagerBuilder (#15205)
    
    * Refactor ClusterContextManagerBuilder
    
    * Refactor ClusterContextManagerBuilder
---
 .../metadata/persist/MetaDataPersistService.java   |   2 +-
 .../cluster/ClusterContextManagerBuilder.java      | 167 +++++++--------------
 .../StandaloneContextManagerBuilder.java           |   8 +-
 3 files changed, 61 insertions(+), 116 deletions(-)

diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistService.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistService.java
index d9eaaec..5f1b27e 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistService.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistService.java
@@ -99,7 +99,7 @@ public final class MetaDataPersistService {
      * 
      * @param instanceId instance id
      * @param labels collection of label
-     * @param isOverwrite whether overwrite registry center's configuration if existed               
+     * @param isOverwrite whether overwrite registry center's configuration if existed
      */
     public void persistInstanceConfigurations(final String instanceId, final Collection<String> labels, final boolean isOverwrite) {
         computeNodePersistService.persistInstanceLabels(instanceId, labels, isOverwrite);
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
index a62acb5..4589853 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
@@ -17,9 +17,7 @@
 
 package org.apache.shardingsphere.mode.manager.cluster;
 
-import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import org.apache.shardingsphere.infra.config.schema.SchemaConfiguration;
 import org.apache.shardingsphere.infra.config.schema.impl.DataSourceProvidedSchemaConfiguration;
 import org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
 import org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyerFactory;
@@ -52,62 +50,46 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
-import java.util.stream.Collectors;
 
 /**
  * Cluster context manager builder.
  */
-@Slf4j
 public final class ClusterContextManagerBuilder implements ContextManagerBuilder {
     
-    private RegistryCenter registryCenter;
-    
-    private MetaDataPersistService metaDataPersistService;
-    
-    private MetaDataContexts metaDataContexts;
-    
-    private TransactionContexts transactionContexts;
-    
-    private InstanceContext instanceContext;
-    
-    private ContextManager contextManager;
-    
     @Override
     public ContextManager build(final ContextManagerBuilderParameter parameter) throws SQLException {
-        beforeBuildContextManager(parameter);
-        contextManager = new ContextManager();
-        contextManager.init(metaDataContexts, transactionContexts, instanceContext);
-        afterBuildContextManager(parameter);
-        return contextManager;
-    }
-    
-    private void beforeBuildContextManager(final ContextManagerBuilderParameter parameter) throws SQLException {
-        ClusterPersistRepository repository = ClusterPersistRepositoryFactory.newInstance((ClusterPersistRepositoryConfiguration) parameter.getModeConfig().getRepository());
-        registryCenter = new RegistryCenter(repository);
         ModeScheduleContextFactory.getInstance().init(parameter.getInstanceDefinition().getInstanceId().getId(), parameter.getModeConfig());
-        metaDataPersistService = new MetaDataPersistService(repository);
+        ClusterPersistRepository repository = ClusterPersistRepositoryFactory.newInstance((ClusterPersistRepositoryConfiguration) parameter.getModeConfig().getRepository());
+        MetaDataPersistService metaDataPersistService = new MetaDataPersistService(repository);
         persistConfigurations(metaDataPersistService, parameter);
-        persistInstanceConfigurations(parameter.getLabels(), parameter.getInstanceDefinition(), parameter.getModeConfig().isOverwrite());
+        MetaDataContextsBuilder metaDataContextsBuilder = createMetaDataContextsBuilder(metaDataPersistService, parameter);
+        persistMetaData(metaDataPersistService, metaDataContextsBuilder.getSchemaMap());
+        ContextManager result = createContextManager(repository, metaDataPersistService, parameter.getInstanceDefinition(), metaDataContextsBuilder.build(metaDataPersistService));
+        registerOnline(repository, metaDataPersistService, parameter.getInstanceDefinition(), result);
+        return result;
+    }
+    
+    private MetaDataContextsBuilder createMetaDataContextsBuilder(final MetaDataPersistService metaDataPersistService, final ContextManagerBuilderParameter parameter) throws SQLException {
         Collection<String> schemaNames = InstanceType.JDBC == parameter.getInstanceDefinition().getInstanceType()
                 ? parameter.getSchemaConfigs().keySet() : metaDataPersistService.getSchemaMetaDataService().loadAllNames();
-        Map<String, Map<String, DataSource>> loadedDataSources = loadDataSourcesMap(metaDataPersistService, parameter.getSchemaConfigs(), schemaNames);
-        Properties loadedProps = metaDataPersistService.getPropsService().load();
-        MetaDataContextsBuilder metaDataContextsBuilder = new MetaDataContextsBuilder(metaDataPersistService.getGlobalRuleService().load(), loadedProps);
-        Map<String, Collection<RuleConfiguration>> loadedSchemaRuleConfigs = loadSchemaRules(metaDataPersistService, schemaNames);
-        for (String each : loadedDataSources.keySet()) {
-            metaDataContextsBuilder.addSchema(each, new DataSourceProvidedSchemaConfiguration(loadedDataSources.get(each), loadedSchemaRuleConfigs.get(each)), loadedProps);
+        Collection<RuleConfiguration> globalRuleConfigs = metaDataPersistService.getGlobalRuleService().load();
+        Properties props = metaDataPersistService.getPropsService().load();
+        MetaDataContextsBuilder result = new MetaDataContextsBuilder(globalRuleConfigs, props);
+        for (String each : schemaNames) {
+            Map<String, DataSource> dataSources = parameter.getSchemaConfigs().containsKey(each)
+                    ? getEffectiveDataSources(metaDataPersistService, each, parameter.getSchemaConfigs().get(each).getDataSources()) : loadDataSources(metaDataPersistService, each);
+            Collection<RuleConfiguration> schemaRuleConfigs = metaDataPersistService.getSchemaRuleService().load(each);
+            result.addSchema(each, new DataSourceProvidedSchemaConfiguration(dataSources, schemaRuleConfigs), props);
         }
-        persistMetaData(metaDataContextsBuilder.getSchemaMap());
-        metaDataContexts = metaDataContextsBuilder.build(metaDataPersistService);
-        transactionContexts = new TransactionContextsBuilder(metaDataContexts.getMetaDataMap(), metaDataContexts.getGlobalRuleMetaData().getRules()).build();
-        instanceContext = new InstanceContext(metaDataPersistService.getComputeNodePersistService().loadComputeNodeInstance(
-                parameter.getInstanceDefinition()), new ClusterWorkerIdGenerator(repository, metaDataPersistService, parameter.getInstanceDefinition()), getType());
+        return result;
     }
     
     private void persistConfigurations(final MetaDataPersistService metaDataPersistService, final ContextManagerBuilderParameter parameter) {
+        boolean isOverwrite = parameter.getModeConfig().isOverwrite();
         if (!isEmptyLocalConfiguration(parameter)) {
-            metaDataPersistService.persistConfigurations(parameter.getSchemaConfigs(), parameter.getGlobalRuleConfigs(), parameter.getProps(), parameter.getModeConfig().isOverwrite());
+            metaDataPersistService.persistConfigurations(parameter.getSchemaConfigs(), parameter.getGlobalRuleConfigs(), parameter.getProps(), isOverwrite);
         }
+        metaDataPersistService.persistInstanceConfigurations(parameter.getInstanceDefinition().getInstanceId().getId(), parameter.getLabels(), isOverwrite);
     }
     
     private boolean isEmptyLocalConfiguration(final ContextManagerBuilderParameter parameter) {
@@ -115,90 +97,55 @@ public final class ClusterContextManagerBuilder implements ContextManagerBuilder
                 && parameter.getGlobalRuleConfigs().isEmpty() && parameter.getProps().isEmpty();
     }
     
-    private void persistInstanceConfigurations(final Collection<String> labels, final InstanceDefinition instanceDefinition, final boolean overwrite) {
-        metaDataPersistService.persistInstanceConfigurations(instanceDefinition.getInstanceId().getId(), labels, overwrite);
-    }
-    
-    private Map<String, Map<String, DataSource>> loadDataSourcesMap(final MetaDataPersistService metaDataPersistService, final Map<String, ? extends SchemaConfiguration> schemaConfig,
-                                                                    final Collection<String> schemaNames) {
-        Map<String, Map<String, DataSourceProperties>> loadedDataSourcePropertiesMap = loadDataSourceDataSourcePropertiesMap(metaDataPersistService, schemaNames);
-        Map<String, Map<String, DataSource>> dataSourcesMap = getDataSourcesMap(schemaConfig);
-        Map<String, Map<String, DataSource>> result = getLoadedDataSourceMap(loadedDataSourcePropertiesMap, dataSourcesMap);
-        closeLocalDataSources(dataSourcesMap, result);
-        return result;
-    }
-    
-    private Map<String, Map<String, DataSourceProperties>> loadDataSourceDataSourcePropertiesMap(final MetaDataPersistService metaDataPersistService, final Collection<String> schemaNames) {
-        Map<String, Map<String, DataSourceProperties>> result = new LinkedHashMap<>();
-        for (String each : schemaNames) {
-            result.put(each, metaDataPersistService.getDataSourceService().load(each));
-        }
-        return result;
-    }
-    
-    private Map<String, Map<String, DataSource>> getDataSourcesMap(final Map<String, ? extends SchemaConfiguration> schemaConfig) {
-        Map<String, Map<String, DataSource>> result = new LinkedHashMap<>(schemaConfig.size(), 1);
-        for (Entry<String, ? extends SchemaConfiguration> entry : schemaConfig.entrySet()) {
-            result.put(entry.getKey(), entry.getValue().getDataSources());
-        }
-        return result;
-    }
-    
-    private Map<String, Map<String, DataSource>> getLoadedDataSourceMap(final Map<String, Map<String, DataSourceProperties>> loadedDataSourcePropertiesMaps,
-                                                                        final Map<String, Map<String, DataSource>> localDataSourceMaps) {
-        Map<String, Map<String, DataSource>> result = new LinkedHashMap<>(loadedDataSourcePropertiesMaps.size(), 1);
-        for (Entry<String, Map<String, DataSourceProperties>> each : loadedDataSourcePropertiesMaps.entrySet()) {
-            Map<String, DataSource> dataSources = new LinkedHashMap<>();
-            Map<String, DataSourceProperties> loadedDataSourcePropertiesMap = loadedDataSourcePropertiesMaps.get(each.getKey());
-            for (Entry<String, DataSourceProperties> entry : loadedDataSourcePropertiesMap.entrySet()) {
-                Map<String, DataSource> localDataSources = localDataSourceMaps.get(each.getKey());
-                if (null != localDataSources && null != localDataSources.get(entry.getKey()) && DataSourcePropertiesCreator.create(localDataSources.get(entry.getKey())).equals(entry.getValue())) {
-                    dataSources.put(entry.getKey(), localDataSources.get(entry.getKey()));
-                } else {
-                    dataSources.put(entry.getKey(), DataSourcePoolCreator.create(entry.getValue()));
-                }
+    private Map<String, DataSource> getEffectiveDataSources(final MetaDataPersistService metaDataPersistService,
+                                                            final String schemaName, final Map<String, DataSource> localDataSources) throws SQLException {
+        Map<String, DataSourceProperties> loadedDataSourcePropsMap = metaDataPersistService.getDataSourceService().load(schemaName);
+        Map<String, DataSource> result = new LinkedHashMap<>(loadedDataSourcePropsMap.size(), 1);
+        for (Entry<String, DataSourceProperties> entry : loadedDataSourcePropsMap.entrySet()) {
+            String dataSourceName = entry.getKey();
+            DataSourceProperties loadedDataSourceProps = entry.getValue();
+            DataSource localDataSource = localDataSources.get(dataSourceName);
+            if (null == localDataSource) {
+                result.put(dataSourceName, DataSourcePoolCreator.create(loadedDataSourceProps));
+            } else if (DataSourcePropertiesCreator.create(localDataSource).equals(loadedDataSourceProps)) {
+                result.put(dataSourceName, localDataSource);
+            } else {
+                DataSourcePoolDestroyerFactory.destroy(localDataSource);
             }
-            result.put(each.getKey(), dataSources);
         }
         return result;
     }
     
-    private void closeLocalDataSources(final Map<String, Map<String, DataSource>> localDataSourceMap, final Map<String, Map<String, DataSource>> loadDataSourceMap) {
-        for (Entry<String, Map<String, DataSource>> entry : localDataSourceMap.entrySet()) {
-            if (loadDataSourceMap.containsKey(entry.getKey())) {
-                entry.getValue().forEach((key, value) -> {
-                    if (null == loadDataSourceMap.get(entry.getKey()).get(key)) {
-                        closeDataSource(value);
-                    }
-                });
-            }
+    private Map<String, DataSource> loadDataSources(final MetaDataPersistService metaDataPersistService, final String schemaName) {
+        Map<String, DataSourceProperties> dataSourceProps = metaDataPersistService.getDataSourceService().load(schemaName);
+        Map<String, DataSource> result = new LinkedHashMap<>(dataSourceProps.size(), 1);
+        for (Entry<String, DataSourceProperties> entry : dataSourceProps.entrySet()) {
+            result.put(entry.getKey(), DataSourcePoolCreator.create(entry.getValue()));
         }
+        return result;
     }
     
-    private void closeDataSource(final DataSource dataSource) {
-        try {
-            DataSourcePoolDestroyerFactory.destroy(dataSource);
-            // CHECKSTYLE:OFF
-        } catch (SQLException ex) {
-            // CHECKSTYLE:ON
-            log.error("Close datasource connection failed", ex);
-        }
-    }
-    
-    private Map<String, Collection<RuleConfiguration>> loadSchemaRules(final MetaDataPersistService metaDataPersistService, final Collection<String> schemaNames) {
-        return schemaNames.stream().collect(Collectors.toMap(
-            each -> each, each -> metaDataPersistService.getSchemaRuleService().load(each), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
-    }
-    
-    private void persistMetaData(final Map<String, ShardingSphereSchema> schemaMap) {
+    private void persistMetaData(final MetaDataPersistService metaDataPersistService, final Map<String, ShardingSphereSchema> schemaMap) {
         for (Entry<String, ShardingSphereSchema> entry : schemaMap.entrySet()) {
             metaDataPersistService.getSchemaMetaDataService().persist(entry.getKey(), entry.getValue());
         }
     }
     
-    private void afterBuildContextManager(final ContextManagerBuilderParameter parameter) {
+    private ContextManager createContextManager(final ClusterPersistRepository repository,
+                                                final MetaDataPersistService metaDataPersistService, final InstanceDefinition instanceDefinition, final MetaDataContexts metaDataContexts) {
+        TransactionContexts transactionContexts = new TransactionContextsBuilder(metaDataContexts.getMetaDataMap(), metaDataContexts.getGlobalRuleMetaData().getRules()).build();
+        InstanceContext instanceContext = new InstanceContext(metaDataPersistService.getComputeNodePersistService().loadComputeNodeInstance(instanceDefinition),
+                new ClusterWorkerIdGenerator(repository, metaDataPersistService, instanceDefinition), getType());
+        ContextManager result = new ContextManager();
+        result.init(metaDataContexts, transactionContexts, instanceContext);
+        return result;
+    }
+    
+    private void registerOnline(final ClusterPersistRepository repository, 
+                                final MetaDataPersistService metaDataPersistService, final InstanceDefinition instanceDefinition, final ContextManager contextManager) {
+        RegistryCenter registryCenter = new RegistryCenter(repository);
         new ClusterContextManagerCoordinator(metaDataPersistService, contextManager, registryCenter);
-        registryCenter.onlineInstance(parameter.getInstanceDefinition());
+        registryCenter.onlineInstance(instanceDefinition);
     }
     
     @Override
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
index b0dcd5d..4ba5324 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
@@ -54,9 +54,7 @@ public final class StandaloneContextManagerBuilder implements ContextManagerBuil
     public ContextManager build(final ContextManagerBuilderParameter parameter) throws SQLException {
         MetaDataPersistService metaDataPersistService = new MetaDataPersistService(StandalonePersistRepositoryFactory.newInstance(parameter.getModeConfig().getRepository()));
         persistConfigurations(metaDataPersistService, parameter);
-        MetaDataContexts metaDataContexts = createMetaDataContexts(metaDataPersistService, parameter);
-        TransactionContexts transactionContexts = new TransactionContextsBuilder(metaDataContexts.getMetaDataMap(), metaDataContexts.getGlobalRuleMetaData().getRules()).build();
-        return createContextManager(metaDataPersistService, parameter, metaDataContexts, transactionContexts);
+        return createContextManager(metaDataPersistService, parameter, createMetaDataContexts(metaDataPersistService, parameter));
     }
     
     private MetaDataContexts createMetaDataContexts(final MetaDataPersistService metaDataPersistService, final ContextManagerBuilderParameter parameter) throws SQLException {
@@ -113,9 +111,9 @@ public final class StandaloneContextManagerBuilder implements ContextManagerBuil
         return result;
     }
     
-    private ContextManager createContextManager(final MetaDataPersistService metaDataPersistService,
-                                                final ContextManagerBuilderParameter parameter, final MetaDataContexts metaDataContexts, final TransactionContexts transactionContexts) {
+    private ContextManager createContextManager(final MetaDataPersistService metaDataPersistService, final ContextManagerBuilderParameter parameter, final MetaDataContexts metaDataContexts) {
         ContextManager result = new ContextManager();
+        TransactionContexts transactionContexts = new TransactionContextsBuilder(metaDataContexts.getMetaDataMap(), metaDataContexts.getGlobalRuleMetaData().getRules()).build();
         InstanceContext instanceContext = new InstanceContext(
                 metaDataPersistService.getComputeNodePersistService().loadComputeNodeInstance(parameter.getInstanceDefinition()), new StandaloneWorkerIdGenerator(), getType());
         result.init(metaDataContexts, transactionContexts, instanceContext);