This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 3104baf684c fix config shadow and readwrite rule. (#20848)
3104baf684c is described below
commit 3104baf684cbd105eb1c04aac8789c0355783500
Author: Chuxin Chen <[email protected]>
AuthorDate: Wed Sep 7 12:38:31 2022 +0800
fix config shadow and readwrite rule. (#20848)
---
...ReadwriteSplittingRuleConfigurationChecker.java | 22 +++++++++++++-----
...writeSplittingRuleConfigurationCheckerTest.java | 27 ++++++++++++++++++++--
2 files changed, 41 insertions(+), 8 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
index 9e41c525347..471a2292922 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
@@ -22,6 +22,7 @@ import com.google.common.base.Strings;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
import org.apache.shardingsphere.infra.util.expr.InlineExpressionParser;
import
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionWeightReadQueryLoadBalanceAlgorithm;
@@ -62,29 +63,38 @@ public abstract class
AbstractReadwriteSplittingRuleConfigurationChecker<T exten
for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(each.getName()),
"Readwrite-splitting data source name is required.");
Preconditions.checkState(null != each.getStaticStrategy() || null
!= each.getDynamicStrategy(), "No available readwrite-splitting rule
configuration in database `%s`.", databaseName);
- Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional
-> checkStaticStrategy(databaseName, dataSourceMap, addedWriteDataSourceNames,
addedReadDataSourceNames, optional));
+ Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional
-> checkStaticStrategy(databaseName, dataSourceMap, addedWriteDataSourceNames,
addedReadDataSourceNames, optional, rules));
Optional.ofNullable(each.getDynamicStrategy()).ifPresent(optional
-> checkDynamicStrategy(rules, optional));
}
}
private void checkStaticStrategy(final String databaseName, final
Map<String, DataSource> dataSourceMap, final Collection<String>
addedWriteDataSourceNames,
- final Collection<String>
readDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration
strategyConfig) {
+ final Collection<String>
readDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration
strategyConfig, final Collection<ShardingSphereRule> rules) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(strategyConfig.getWriteDataSourceName()),
"Write data source name is required.");
Preconditions.checkArgument(!strategyConfig.getReadDataSourceNames().isEmpty(),
"Read data source names are required.");
- checkWriteDataSourceNames(databaseName, dataSourceMap,
addedWriteDataSourceNames, strategyConfig);
+ checkWriteDataSourceNames(databaseName, dataSourceMap,
addedWriteDataSourceNames, strategyConfig, rules);
for (String each : readDataSourceNames) {
checkReadeDataSourceNames(databaseName, dataSourceMap,
readDataSourceNames, each);
}
}
- private void checkWriteDataSourceNames(final String databaseName, final
Map<String, DataSource> dataSourceMap,
- final Collection<String>
addedWriteDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration
strategyConfig) {
+ private void checkWriteDataSourceNames(final String databaseName, final
Map<String, DataSource> dataSourceMap, final Collection<String>
addedWriteDataSourceNames,
+ final
StaticReadwriteSplittingStrategyConfiguration strategyConfig, final
Collection<ShardingSphereRule> rules) {
for (String each : new
InlineExpressionParser(strategyConfig.getWriteDataSourceName()).splitAndEvaluate())
{
- Preconditions.checkState(dataSourceMap.containsKey(each), "Write
data source name `%s` not in database `%s`.", each, databaseName);
+ Preconditions.checkState(dataSourceMap.containsKey(each) ||
containsInOtherRules(each, rules), "Write data source name `%s` not in database
`%s`.", each, databaseName);
Preconditions.checkState(addedWriteDataSourceNames.add(each), "Can
not config duplicate write data source `%s` in database `%s`.", each,
databaseName);
}
}
+ private boolean containsInOtherRules(final String datasourceName, final
Collection<ShardingSphereRule> rules) {
+ for (ShardingSphereRule each : rules) {
+ if (each instanceof DataSourceContainedRule &&
((DataSourceContainedRule)
each).getDataSourceMapper().containsKey(datasourceName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private void checkReadeDataSourceNames(final String databaseName,
final Map<String, DataSource>
dataSourceMap, final Collection<String> addedReadDataSourceNames, final String
readDataSourceName) {
for (String each : new
InlineExpressionParser(readDataSourceName).splitAndEvaluate()) {
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
index 59405db266b..53895cd4acf 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.readwritesplitting.checker;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationCheckerFactory;
+import
org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
@@ -29,16 +30,17 @@ import org.junit.Test;
import javax.sql.DataSource;
import java.util.Arrays;
-import java.util.Properties;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.LinkedHashMap;
import java.util.Optional;
+import java.util.Properties;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -124,6 +126,27 @@ public final class
ReadwriteSplittingRuleConfigurationCheckerTest {
checker.get().check("test", config, mockDataSources(),
Collections.emptyList());
}
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ @Test
+ public void assertCheckWhenConfigOtherRulesDatasource() {
+ ReadwriteSplittingRuleConfiguration config =
createContainsOtherRulesDatasourceConfig();
+ Optional<RuleConfigurationChecker> checker =
RuleConfigurationCheckerFactory.findInstance(config);
+ assertTrue(checker.isPresent());
+ assertThat(checker.get(),
instanceOf(ReadwriteSplittingRuleConfigurationChecker.class));
+ DataSourceContainedRule dataSourceContainedRule =
mock(DataSourceContainedRule.class, RETURNS_DEEP_STUBS);
+
when(dataSourceContainedRule.getDataSourceMapper().containsKey("otherDatasourceName")).thenReturn(true);
+ checker.get().check("test", config, mockDataSources(),
Collections.singleton(dataSourceContainedRule));
+ }
+
+ private ReadwriteSplittingRuleConfiguration
createContainsOtherRulesDatasourceConfig() {
+ ReadwriteSplittingRuleConfiguration result =
mock(ReadwriteSplittingRuleConfiguration.class);
+ ReadwriteSplittingDataSourceRuleConfiguration dataSourceConfig =
mock(ReadwriteSplittingDataSourceRuleConfiguration.class);
+ when(dataSourceConfig.getName()).thenReturn("readwrite_ds");
+ when(dataSourceConfig.getStaticStrategy()).thenReturn(new
StaticReadwriteSplittingStrategyConfiguration("otherDatasourceName",
Arrays.asList("read_ds_0", "read_ds_1")));
+
when(result.getDataSources()).thenReturn(Collections.singletonList(dataSourceConfig));
+ return result;
+ }
+
private ReadwriteSplittingDataSourceRuleConfiguration
createDataSourceRuleConfig(final String writeDataSource, final List<String>
readDataSources) {
ReadwriteSplittingDataSourceRuleConfiguration result =
mock(ReadwriteSplittingDataSourceRuleConfiguration.class);
StaticReadwriteSplittingStrategyConfiguration
readwriteSplittingStrategy =
mock(StaticReadwriteSplittingStrategyConfiguration.class);