You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/02/23 07:26:08 UTC
[shardingsphere] branch master updated: Add support for generate narayana config file when the first resource added on cluster mode (#15566)
This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 e9fc2d8 Add support for generate narayana config file when the first resource added on cluster mode (#15566)
e9fc2d8 is described below
commit e9fc2d81fbcfe78dfed4661305d13ae5c46f1e96
Author: JingShang Lu <ji...@gmail.com>
AuthorDate: Wed Feb 23 15:25:14 2022 +0800
Add support for generate narayana config file when the first resource added on cluster mode (#15566)
* add support for generate narayana config file when the first resource added on cluster mode
---
.../spi/TransactionConfigurationFileGenerator.java | 8 ++++----
.../config/NarayanaConfigurationFileGenerator.java | 21 ++++++++++-----------
.../shardingsphere/mode/manager/ContextManager.java | 19 ++++++++++++++++++-
.../cluster/ClusterContextManagerBuilder.java | 17 +++++++----------
4 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionConfigurationFileGenerator.java b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionConfigurationFileGenerator.java
index 4dd3f4f..280d538 100644
--- a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionConfigurationFileGenerator.java
+++ b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionConfigurationFileGenerator.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.transaction.spi;
import org.apache.shardingsphere.infra.config.schema.SchemaConfiguration;
import org.apache.shardingsphere.infra.instance.InstanceContext;
import org.apache.shardingsphere.spi.typed.TypedSPI;
-import org.apache.shardingsphere.transaction.config.TransactionRuleConfiguration;
import org.apache.shardingsphere.transaction.rule.TransactionRule;
import java.util.Properties;
@@ -39,11 +38,12 @@ public interface TransactionConfigurationFileGenerator extends TypedSPI {
void generateFile(TransactionRule transactionRule, InstanceContext instanceContext);
/**
- * Get transaction configuration.
+ * Get transaction rule props.
*
- * @param transactionRuleConfiguration transaction rule configuration
+ * @param originTransactionProps origin transaction properties
* @param schemaConfiguration schema configuration
+ * @param modeType mode type
* @return transaction rule props
*/
- Properties getTransactionProps(TransactionRuleConfiguration transactionRuleConfiguration, SchemaConfiguration schemaConfiguration);
+ Properties getTransactionProps(Properties originTransactionProps, SchemaConfiguration schemaConfiguration, String modeType);
}
diff --git a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-type/shardingsphere-transaction-xa/shardingsphere-transaction-xa-provider/shardingsphere-transaction-xa-narayana/src/main/java/org/apache/shardingsphere/transaction/xa/narayana/config/NarayanaConfigurationFileGenerator.java b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-type/shardingsphere-transaction-xa/shardingsphere-transaction-xa-provider/shardingsphere-transaction-x [...]
index a7dcc1e..1118659 100644
--- a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-type/shardingsphere-transaction-xa/shardingsphere-transaction-xa-provider/shardingsphere-transaction-xa-narayana/src/main/java/org/apache/shardingsphere/transaction/xa/narayana/config/NarayanaConfigurationFileGenerator.java
+++ b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-type/shardingsphere-transaction-xa/shardingsphere-transaction-xa-provider/shardingsphere-transaction-xa-narayana/src/main/java/org/apache/shardingsphere/transaction/xa/narayana/config/NarayanaConfigurationFileGenerator.java
@@ -34,7 +34,6 @@ import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseT
import org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData;
import org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaDataFactory;
import org.apache.shardingsphere.infra.instance.InstanceContext;
-import org.apache.shardingsphere.transaction.config.TransactionRuleConfiguration;
import org.apache.shardingsphere.transaction.rule.TransactionRule;
import org.apache.shardingsphere.transaction.spi.TransactionConfigurationFileGenerator;
@@ -57,7 +56,7 @@ public final class NarayanaConfigurationFileGenerator implements TransactionConf
String instanceId = instanceContext.getInstance().getInstanceDefinition().getInstanceId().getId();
String recoveryId = null == instanceContext.getInstance().getXaRecoveryId() ? instanceId : instanceContext.getInstance().getXaRecoveryId();
NarayanaConfiguration config = createDefaultConfiguration(instanceId, recoveryId);
- if (null != transactionRule.getProps()) {
+ if (!transactionRule.getProps().isEmpty()) {
appendUserDefinedJdbcStoreConfiguration(transactionRule, config);
}
JAXB.marshal(config, new File(ClassLoader.getSystemResource("").getPath(), "jbossts-properties.xml"));
@@ -139,21 +138,21 @@ public final class NarayanaConfigurationFileGenerator implements TransactionConf
}
@Override
- public Properties getTransactionProps(final TransactionRuleConfiguration transactionRuleConfiguration, final SchemaConfiguration schemaConfiguration) {
+ public Properties getTransactionProps(final Properties originTransactionProps, final SchemaConfiguration schemaConfiguration, final String modeType) {
Properties result = new Properties();
- if (!transactionRuleConfiguration.getProps().isEmpty()) {
- generateUserDefinedJdbcStoreConfiguration(transactionRuleConfiguration, result);
- } else {
+ if (!originTransactionProps.isEmpty()) {
+ generateUserDefinedJdbcStoreConfiguration(originTransactionProps, result);
+ } else if ("Cluster".equals(modeType)) {
generateDefaultJdbcStoreConfiguration(schemaConfiguration, result);
}
return result;
}
- private void generateUserDefinedJdbcStoreConfiguration(final TransactionRuleConfiguration transactionRuleConfiguration, final Properties props) {
- String url = transactionRuleConfiguration.getProps().getProperty("recoveryStoreUrl");
- String user = transactionRuleConfiguration.getProps().getProperty("recoveryStoreUser");
- String password = String.valueOf(transactionRuleConfiguration.getProps().get("recoveryStorePassword"));
- String dataSourceClass = transactionRuleConfiguration.getProps().getProperty("recoveryStoreDataSource");
+ private void generateUserDefinedJdbcStoreConfiguration(final Properties originTransactionProps, final Properties props) {
+ String url = originTransactionProps.getProperty("recoveryStoreUrl");
+ String user = originTransactionProps.getProperty("recoveryStoreUser");
+ String password = String.valueOf(originTransactionProps.get("recoveryStorePassword"));
+ String dataSourceClass = originTransactionProps.getProperty("recoveryStoreDataSource");
generateTransactionProps(url, user, password, dataSourceClass, props);
}
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 4807cd9..7ca206e 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
@@ -22,6 +22,7 @@ import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.infra.config.RuleConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.config.schema.SchemaConfiguration;
import org.apache.shardingsphere.infra.config.schema.impl.DataSourceProvidedSchemaConfiguration;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
@@ -44,10 +45,13 @@ import org.apache.shardingsphere.infra.rule.builder.schema.SchemaRulesBuilder;
import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder;
+import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
import org.apache.shardingsphere.transaction.ShardingSphereTransactionManagerEngine;
import org.apache.shardingsphere.transaction.context.TransactionContexts;
import org.apache.shardingsphere.transaction.rule.TransactionRule;
import org.apache.shardingsphere.transaction.rule.builder.DefaultTransactionRuleConfigurationBuilder;
+import org.apache.shardingsphere.transaction.spi.TransactionConfigurationFileGenerator;
+import org.apache.shardingsphere.transaction.spi.TransactionConfigurationFileGeneratorFactory;
import javax.sql.DataSource;
import java.sql.SQLException;
@@ -453,13 +457,24 @@ public final class ContextManager implements AutoCloseable {
Map<String, DataSource> dataSourceMap = new HashMap<>(originalMetaData.getResource().getDataSources());
dataSourceMap.putAll(DataSourcePoolCreator.create(addedDataSourceProps));
Properties props = metaDataContexts.getProps().getProps();
+ SchemaConfiguration schemaConfiguration = new DataSourceProvidedSchemaConfiguration(dataSourceMap, originalMetaData.getRuleMetaData().getConfigurations());
+ Optional<MetaDataPersistService> metaDataPersistService = metaDataContexts.getMetaDataPersistService();
+ metaDataPersistService.ifPresent(optional -> persistTransactionConfiguration(schemaConfiguration, optional));
MetaDataContextsBuilder metaDataContextsBuilder = new MetaDataContextsBuilder(metaDataContexts.getGlobalRuleMetaData().getConfigurations(), props);
- metaDataContextsBuilder.addSchema(originalMetaData.getName(), new DataSourceProvidedSchemaConfiguration(dataSourceMap, originalMetaData.getRuleMetaData().getConfigurations()), props);
+ metaDataContextsBuilder.addSchema(originalMetaData.getName(), schemaConfiguration, props);
metaDataContexts.getMetaDataPersistService().ifPresent(
optional -> optional.getSchemaMetaDataService().persist(originalMetaData.getName(), metaDataContextsBuilder.getSchemaMap().get(originalMetaData.getName())));
return metaDataContextsBuilder.build(metaDataContexts.getMetaDataPersistService().orElse(null));
}
+ private void persistTransactionConfiguration(final SchemaConfiguration schemaConfiguration, final MetaDataPersistService metaDataPersistService) {
+ Optional<TransactionConfigurationFileGenerator> fileGenerator = TransactionConfigurationFileGeneratorFactory.newInstance(getTransactionRule().getProviderType());
+ if (fileGenerator.isPresent()) {
+ Properties transactionProps = fileGenerator.get().getTransactionProps(getTransactionRule().getProps(), schemaConfiguration, instanceContext.getModeConfiguration().getType());
+ metaDataPersistService.persistTransactionRule(transactionProps, true);
+ }
+ }
+
private MetaDataContexts buildChangedMetaDataContext(final ShardingSphereMetaData originalMetaData, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
Properties props = metaDataContexts.getProps().getProps();
MetaDataContextsBuilder metaDataContextsBuilder = new MetaDataContextsBuilder(metaDataContexts.getGlobalRuleMetaData().getConfigurations(), props);
@@ -522,6 +537,8 @@ public final class ContextManager implements AutoCloseable {
}
private ShardingSphereTransactionManagerEngine createNewEngine(final DatabaseType databaseType, final Map<String, DataSource> dataSources) {
+ Optional<TransactionConfigurationFileGenerator> fileGenerator = TransactionConfigurationFileGeneratorFactory.newInstance(getTransactionRule().getProviderType());
+ fileGenerator.ifPresent(optional -> optional.generateFile(getTransactionRule(), instanceContext));
ShardingSphereTransactionManagerEngine result = new ShardingSphereTransactionManagerEngine();
result.init(databaseType, dataSources, getTransactionRule());
return result;
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 34cb39b..a4cc8d6 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
@@ -24,7 +24,6 @@ import org.apache.shardingsphere.infra.config.schema.impl.DataSourceProvidedSche
import org.apache.shardingsphere.infra.instance.InstanceContext;
import org.apache.shardingsphere.infra.instance.definition.InstanceDefinition;
import org.apache.shardingsphere.infra.instance.definition.InstanceType;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
@@ -79,18 +78,17 @@ public final class ClusterContextManagerBuilder implements ContextManagerBuilder
Collection<String> schemaNames = InstanceType.JDBC == parameter.getInstanceDefinition().getInstanceType()
? parameter.getSchemaConfigs().keySet() : metaDataPersistService.getSchemaMetaDataService().loadAllNames();
Optional<String> schemaName = schemaNames.stream().findFirst();
- if (!schemaName.isPresent()) {
- return;
- }
Collection<RuleConfiguration> globalRuleConfigs = metaDataPersistService.getGlobalRuleService().load();
Optional<TransactionRuleConfiguration> transactionRuleConfiguration =
globalRuleConfigs.stream().filter(each -> each instanceof TransactionRuleConfiguration).map(each -> (TransactionRuleConfiguration) each).findFirst();
Optional<TransactionConfigurationFileGenerator> fileGenerator = transactionRuleConfiguration.isPresent() ? TransactionConfigurationFileGeneratorFactory
.newInstance(transactionRuleConfiguration.get().getProviderType()) : Optional.empty();
if (fileGenerator.isPresent()) {
- SchemaConfiguration schemaConfiguration = createSchemaConfiguration(schemaName.get(), metaDataPersistService, parameter);
- Properties transactionProps = fileGenerator.get().getTransactionProps(transactionRuleConfiguration.get(), schemaConfiguration);
- metaDataPersistService.persistTransactionRule(transactionProps, true);
+ if (schemaName.isPresent()) {
+ SchemaConfiguration schemaConfiguration = createSchemaConfiguration(schemaName.get(), metaDataPersistService, parameter);
+ Properties transactionProps = fileGenerator.get().getTransactionProps(transactionRuleConfiguration.get().getProps(), schemaConfiguration, getType());
+ metaDataPersistService.persistTransactionRule(transactionProps, true);
+ }
String instanceId = parameter.getInstanceDefinition().getInstanceId().getId();
if (!metaDataPersistService.getComputeNodePersistService().loadXaRecoveryId(instanceId).isPresent()) {
metaDataPersistService.getComputeNodePersistService().persistInstanceXaRecoveryId(instanceId, instanceId);
@@ -111,7 +109,7 @@ public final class ClusterContextManagerBuilder implements ContextManagerBuilder
}
private SchemaConfiguration createSchemaConfiguration(final String schemaName, final MetaDataPersistService metaDataPersistService,
- final ContextManagerBuilderParameter parameter) throws SQLException {
+ final ContextManagerBuilderParameter parameter) throws SQLException {
Map<String, DataSource> dataSources = metaDataPersistService.getEffectiveDataSources(schemaName, parameter.getSchemaConfigs());
Collection<RuleConfiguration> schemaRuleConfigs = metaDataPersistService.getSchemaRuleService().load(schemaName);
return new DataSourceProvidedSchemaConfiguration(dataSources, schemaRuleConfigs);
@@ -146,8 +144,7 @@ public final class ClusterContextManagerBuilder implements ContextManagerBuilder
private void generateTransactionConfigurationFile(final InstanceContext instanceContext, final MetaDataContexts metaDataContexts) {
Optional<TransactionRule> transactionRule =
metaDataContexts.getGlobalRuleMetaData().getRules().stream().filter(each -> each instanceof TransactionRule).map(each -> (TransactionRule) each).findFirst();
- Optional<ShardingSphereMetaData> shardingSphereMetaData = metaDataContexts.getMetaDataMap().values().stream().findFirst();
- if (transactionRule.isPresent() && shardingSphereMetaData.isPresent()) {
+ if (transactionRule.isPresent()) {
Optional<TransactionConfigurationFileGenerator> fileGenerator = TransactionConfigurationFileGeneratorFactory.newInstance(transactionRule.get().getProviderType());
fileGenerator.ifPresent(optional -> optional.generateFile(transactionRule.get(), instanceContext));
}