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 17424ce45ca Fix load balancer not effect problem when has two groups 
readwrite-splitting rule refer to the same one load balancer. (#22059)
17424ce45ca is described below

commit 17424ce45ca04d599f6c778e872cb61148330dfd
Author: zhaojinchao <[email protected]>
AuthorDate: Thu Nov 10 22:03:45 2022 +0800

    Fix load balancer not effect problem when has two groups 
readwrite-splitting rule refer to the same one load balancer. (#22059)
---
 .../rule/ReadwriteSplittingRule.java               | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index e723232c372..9703ef5d0c8 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.readwritesplitting.rule;
 
 import com.google.common.base.Preconditions;
 import lombok.Getter;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.distsql.constant.ExportableConstants;
 import 
org.apache.shardingsphere.infra.distsql.constant.ExportableItemConstants;
@@ -60,31 +61,38 @@ public final class ReadwriteSplittingRule implements 
DatabaseRule, DataSourceCon
     @Getter
     private final RuleConfiguration configuration;
     
-    private final Map<String, ReadQueryLoadBalanceAlgorithm> loadBalancers = 
new LinkedHashMap<>();
-    
     private final Map<String, ReadwriteSplittingDataSourceRule> 
dataSourceRules;
     
     public ReadwriteSplittingRule(final ReadwriteSplittingRuleConfiguration 
ruleConfig, final Collection<ShardingSphereRule> builtRules) {
         configuration = ruleConfig;
-        ruleConfig.getLoadBalancers().forEach((key, value) -> 
loadBalancers.put(key, 
ReadQueryLoadBalanceAlgorithmFactory.newInstance(value)));
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            
dataSourceRules.putAll(createReadwriteSplittingDataSourceRules(each, 
builtRules));
+            
dataSourceRules.putAll(createReadwriteSplittingDataSourceRules(each, 
ruleConfig.getLoadBalancers(), builtRules));
         }
     }
     
     public ReadwriteSplittingRule(final 
AlgorithmProvidedReadwriteSplittingRuleConfiguration ruleConfig, final 
Collection<ShardingSphereRule> builtRules) {
         configuration = ruleConfig;
-        loadBalancers.putAll(ruleConfig.getLoadBalanceAlgorithms());
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            
dataSourceRules.putAll(createReadwriteSplittingDataSourceRules(each, 
builtRules));
+            
dataSourceRules.putAll(createReadwriteSplittingDataSourceRules0(each, 
ruleConfig.getLoadBalanceAlgorithms(), builtRules));
         }
     }
     
     private Map<String, ReadwriteSplittingDataSourceRule> 
createReadwriteSplittingDataSourceRules(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
+                                                                               
                   final Map<String, AlgorithmConfiguration> algorithmConfigs,
                                                                                
                   final Collection<ShardingSphereRule> builtRules) {
-        ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = 
loadBalancers.getOrDefault(config.getLoadBalancerName(), 
ReadQueryLoadBalanceAlgorithmFactory.newInstance());
+        ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = null == 
algorithmConfigs.get(config.getLoadBalancerName()) ? 
ReadQueryLoadBalanceAlgorithmFactory.newInstance()
+                : 
ReadQueryLoadBalanceAlgorithmFactory.newInstance(algorithmConfigs.get(config.getLoadBalancerName()));
+        return null == config.getStaticStrategy()
+                ? createDynamicReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm)
+                : createStaticReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm);
+    }
+    
+    private Map<String, ReadwriteSplittingDataSourceRule> 
createReadwriteSplittingDataSourceRules0(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
+                                                                               
                    final Map<String, ReadQueryLoadBalanceAlgorithm> 
loadBalanceAlgorithms,
+                                                                               
                    final Collection<ShardingSphereRule> builtRules) {
+        ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = 
loadBalanceAlgorithms.getOrDefault(config.getLoadBalancerName(), 
ReadQueryLoadBalanceAlgorithmFactory.newInstance());
         return null == config.getStaticStrategy()
                 ? createDynamicReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm)
                 : createStaticReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm);

Reply via email to