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/07/12 04:34:23 UTC
[shardingsphere] branch master updated: Fix read-write-split routing policy (#19028)
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 2af215eaba4 Fix read-write-split routing policy (#19028)
2af215eaba4 is described below
commit 2af215eaba43242b85054891470867e705f4388e
Author: JingShang Lu <ji...@gmail.com>
AuthorDate: Tue Jul 12 12:34:16 2022 +0800
Fix read-write-split routing policy (#19028)
* fix FixedReplicaRandomLoadBalanceAlgorithm FixedReplicaRoundRobinLoadBalanceAlgorithm FixedReplicaWeightLoadBalanceAlgorithm
* add UT
* fix
* fix
---
.../FixedReplicaRandomLoadBalanceAlgorithm.java | 9 ++++++---
.../FixedReplicaRoundRobinLoadBalanceAlgorithm.java | 9 ++++++---
.../FixedReplicaWeightLoadBalanceAlgorithm.java | 9 ++++++---
.../FixedReplicaRandomLoadBalanceAlgorithmTest.java | 17 ++++++++++++++++-
...edReplicaRoundRobinLoadBalanceAlgorithmTest.java | 17 ++++++++++++++++-
.../FixedReplicaWeightLoadBalanceAlgorithmTest.java | 21 +++++++++++++++++++--
6 files changed, 69 insertions(+), 13 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
index d3c2e856f9b..b34b3d7a283 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
@@ -40,10 +40,13 @@ public final class FixedReplicaRandomLoadBalanceAlgorithm implements ReadQueryLo
@Override
public String getDataSource(final String name, final String writeDataSourceName, final List<String> readDataSourceNames) {
- if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
- TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size())));
+ if (TransactionHolder.isTransaction()) {
+ if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+ TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size())));
+ }
+ return TransactionHolder.getReadWriteSplitRoutedReplica();
}
- return TransactionHolder.getReadWriteSplitRoutedReplica();
+ return readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size()));
}
@Override
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
index b2ca75b5a57..31ed19c4ee3 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
@@ -42,10 +42,13 @@ public final class FixedReplicaRoundRobinLoadBalanceAlgorithm implements ReadQue
@Override
public String getDataSource(final String name, final String writeDataSourceName, final List<String> readDataSourceNames) {
- if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
- TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(Math.abs(count.getAndIncrement()) % readDataSourceNames.size()));
+ if (TransactionHolder.isTransaction()) {
+ if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+ TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(Math.abs(count.getAndIncrement()) % readDataSourceNames.size()));
+ }
+ return TransactionHolder.getReadWriteSplitRoutedReplica();
}
- return TransactionHolder.getReadWriteSplitRoutedReplica();
+ return readDataSourceNames.get(Math.abs(count.getAndIncrement()) % readDataSourceNames.size());
}
@Override
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
index e77bd7b4452..a76ce399cba 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
@@ -48,10 +48,13 @@ public final class FixedReplicaWeightLoadBalanceAlgorithm implements ReadQueryLo
public String getDataSource(final String name, final String writeDataSourceName, final List<String> readDataSourceNames) {
double[] weight = WEIGHT_MAP.containsKey(name) ? WEIGHT_MAP.get(name) : initWeight(readDataSourceNames);
WEIGHT_MAP.putIfAbsent(name, weight);
- if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
- TransactionHolder.setReadWriteSplitRoutedReplica(getDataSourceName(readDataSourceNames, weight));
+ if (TransactionHolder.isTransaction()) {
+ if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+ TransactionHolder.setReadWriteSplitRoutedReplica(getDataSourceName(readDataSourceNames, weight));
+ }
+ return TransactionHolder.getReadWriteSplitRoutedReplica();
}
- return TransactionHolder.getReadWriteSplitRoutedReplica();
+ return getDataSourceName(readDataSourceNames, weight);
}
private String getDataSourceName(final List<String> readDataSourceNames, final double[] weight) {
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
index 192ffec191d..0a13a5a1d0d 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
@@ -21,6 +21,7 @@ import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.Test;
import java.util.Arrays;
+import java.util.LinkedList;
import java.util.List;
import static org.junit.Assert.assertTrue;
@@ -32,7 +33,7 @@ public final class FixedReplicaRandomLoadBalanceAlgorithmTest {
private final FixedReplicaRandomLoadBalanceAlgorithm fixedReplicaRandomLoadBalanceAlgorithm = new FixedReplicaRandomLoadBalanceAlgorithm();
@Test
- public void assertGetDataSource() {
+ public void assertGetDataSourceInTransaction() {
String writeDataSourceName = "test_write_ds";
String readDataSourceName1 = "test_replica_ds_1";
String readDataSourceName2 = "test_replica_ds_2";
@@ -44,4 +45,18 @@ public final class FixedReplicaRandomLoadBalanceAlgorithmTest {
assertThat(fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds", writeDataSourceName, readDataSourceNames), is(routeDataSource));
TransactionHolder.clear();
}
+
+ @Test
+ public void assertGetDataSourceWithoutTransaction() {
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_replica_ds_1";
+ String readDataSourceName2 = "test_replica_ds_2";
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, readDataSourceName2);
+ List<String> noTransactionReadDataSourceNames = new LinkedList<>();
+ for (int i = 0; i < 5; i++) {
+ String routeDataSource = fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds", writeDataSourceName, readDataSourceNames);
+ noTransactionReadDataSourceNames.add(routeDataSource);
+ }
+ assertTrue(noTransactionReadDataSourceNames.size() > 1);
+ }
}
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
index 2f5a21ddbe4..9e349da3429 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
@@ -21,6 +21,7 @@ import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.Test;
import java.util.Arrays;
+import java.util.LinkedList;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
@@ -32,7 +33,7 @@ public final class FixedReplicaRoundRobinLoadBalanceAlgorithmTest {
private final FixedReplicaRoundRobinLoadBalanceAlgorithm fixedReplicaRoundRobinLoadBalanceAlgorithm = new FixedReplicaRoundRobinLoadBalanceAlgorithm();
@Test
- public void assertGetDataSource() {
+ public void assertGetDataSourceInTransaction() {
String writeDataSourceName = "test_write_ds";
String readDataSourceName1 = "test_replica_ds_1";
String readDataSourceName2 = "test_replica_ds_2";
@@ -45,4 +46,18 @@ public final class FixedReplicaRoundRobinLoadBalanceAlgorithmTest {
assertThat(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds", writeDataSourceName, readDataSourceNames), is(routeDataSource));
TransactionHolder.clear();
}
+
+ @Test
+ public void assertGetDataSourceWithoutTransaction() {
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_replica_ds_1";
+ String readDataSourceName2 = "test_replica_ds_2";
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, readDataSourceName2);
+ List<String> noTransactionReadDataSourceNames = new LinkedList<>();
+ for (int i = 0; i < 5; i++) {
+ String routeDataSource = fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds", writeDataSourceName, readDataSourceNames);
+ noTransactionReadDataSourceNames.add(routeDataSource);
+ }
+ assertTrue(noTransactionReadDataSourceNames.size() > 1);
+ }
}
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
index 078f80b8f65..92334e14e1b 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
@@ -27,12 +27,14 @@ import org.junit.Test;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertTrue;
public final class FixedReplicaWeightLoadBalanceAlgorithmTest {
@@ -46,7 +48,7 @@ public final class FixedReplicaWeightLoadBalanceAlgorithmTest {
}
@Test
- public void assertGetSingleReadDataSource() {
+ public void assertGetSingleReadDataSourceInTransaction() {
FixedReplicaWeightLoadBalanceAlgorithm fixedReplicaWeightLoadBalanceAlgorithm = createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
TransactionHolder.isTransaction();
String routeDataSource = fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", "test_write_ds", Collections.singletonList("test_read_ds_1"));
@@ -62,7 +64,22 @@ public final class FixedReplicaWeightLoadBalanceAlgorithmTest {
}
@Test
- public void assertGetMultipleReadDataSources() {
+ public void assertGetMultipleReadDataSourcesWithoutTransaction() {
+ FixedReplicaWeightLoadBalanceAlgorithm fixedReplicaWeightLoadBalanceAlgorithm = createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_read_ds_1";
+ String readDataSourceName2 = "test_read_ds_2";
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1, readDataSourceName2);
+ List<String> noTransactionReadDataSourceNames = new LinkedList<>();
+ for (int i = 0; i < 5; i++) {
+ String routeDataSource = fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", writeDataSourceName, readDataSourceNames);
+ noTransactionReadDataSourceNames.add(routeDataSource);
+ }
+ assertTrue(noTransactionReadDataSourceNames.size() > 1);
+ }
+
+ @Test
+ public void assertGetMultipleReadDataSourcesInTransaction() {
FixedReplicaWeightLoadBalanceAlgorithm fixedReplicaWeightLoadBalanceAlgorithm = createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
String writeDataSourceName = "test_write_ds";
String readDataSourceName1 = "test_read_ds_1";