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 <[email protected]>
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";