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