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

Reply via email to