You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/11/10 14:04:02 UTC
[shardingsphere] branch master updated: Fix load balancer not effect problem when has two groups readwrite-splitting rule refer to the same one load balancer. (#22059)
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 <zh...@apache.org>
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);