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