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