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