This is an automated email from the ASF dual-hosted git repository.

terrymanu 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 cb2a869ff57 Prevent negative round-robin index on counter overflow 
(#39339)
cb2a869ff57 is described below

commit cb2a869ff57ff66d514397cca571d242c03eb50c
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Aug 5 00:36:20 2026 +0800

    Prevent negative round-robin index on counter overflow (#39339)
---
 .../round/robin/RoundRobinLoadBalanceAlgorithm.java       |  2 +-
 .../round/robin/RoundRobinLoadBalanceAlgorithmTest.java   | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git 
a/infra/algorithm/type/load-balancer/type/round-robin/src/main/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithm.java
 
b/infra/algorithm/type/load-balancer/type/round-robin/src/main/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithm.java
index 6511e110bdb..0bd7620edf8 100644
--- 
a/infra/algorithm/type/load-balancer/type/round-robin/src/main/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithm.java
+++ 
b/infra/algorithm/type/load-balancer/type/round-robin/src/main/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithm.java
@@ -33,7 +33,7 @@ public final class RoundRobinLoadBalanceAlgorithm implements 
LoadBalanceAlgorith
     @HighFrequencyInvocation
     @Override
     public String getTargetName(final String groupName, final List<String> 
availableTargetNames) {
-        return availableTargetNames.get(Math.abs(count.getAndIncrement()) % 
availableTargetNames.size());
+        return availableTargetNames.get(Math.floorMod(count.getAndIncrement(), 
availableTargetNames.size()));
     }
     
     @Override
diff --git 
a/infra/algorithm/type/load-balancer/type/round-robin/src/test/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithmTest.java
 
b/infra/algorithm/type/load-balancer/type/round-robin/src/test/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithmTest.java
index 57e7ca08308..6913b12697f 100644
--- 
a/infra/algorithm/type/load-balancer/type/round-robin/src/test/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithmTest.java
+++ 
b/infra/algorithm/type/load-balancer/type/round-robin/src/test/java/org/apache/shardingsphere/infra/algorithm/loadbalancer/round/robin/RoundRobinLoadBalanceAlgorithmTest.java
@@ -20,10 +20,12 @@ package 
org.apache.shardingsphere.infra.algorithm.loadbalancer.round.robin;
 import 
org.apache.shardingsphere.infra.algorithm.loadbalancer.spi.LoadBalanceAlgorithm;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.junit.jupiter.api.Test;
+import org.mockito.internal.configuration.plugins.Plugins;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -39,6 +41,19 @@ class RoundRobinLoadBalanceAlgorithmTest {
         assertRoundRobinLoadBalance(availableTargetName1, 
availableTargetName2, loadBalanceAlgorithm, availableTargetNames);
     }
     
+    @Test
+    void assertGetAvailableTargetNameWhenCountOverflow() throws 
ReflectiveOperationException {
+        LoadBalanceAlgorithm loadBalanceAlgorithm = 
TypedSPILoader.getService(LoadBalanceAlgorithm.class, "ROUND_ROBIN", new 
Properties());
+        AtomicInteger count = (AtomicInteger) 
Plugins.getMemberAccessor().get(RoundRobinLoadBalanceAlgorithm.class.getDeclaredField("count"),
 loadBalanceAlgorithm);
+        count.set(Integer.MIN_VALUE);
+        try {
+            String actualTargetName = 
loadBalanceAlgorithm.getTargetName("foo_group", Arrays.asList("foo_ds_0", 
"foo_ds_1", "foo_ds_2"));
+            assertThat(actualTargetName, is("foo_ds_1"));
+        } finally {
+            count.set(0);
+        }
+    }
+    
     private void assertRoundRobinLoadBalance(final String 
availableTargetName1, final String availableTargetName2, final 
LoadBalanceAlgorithm loadBalanceAlgorithm,
                                              final List<String> 
availableTargetNames) {
         assertThat(loadBalanceAlgorithm.getTargetName("ds", 
availableTargetNames), is(availableTargetName1));

Reply via email to