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

Reply via email to