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

liujun pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new caed64b2a6 Fix #13750, ConsistentHashLoadBalance not base on arguments 
(#13753)
caed64b2a6 is described below

commit caed64b2a6e3e4113350dca27f931c129d211dff
Author: Albumen Kevin <[email protected]>
AuthorDate: Mon Feb 19 10:00:19 2024 +0800

    Fix #13750, ConsistentHashLoadBalance not base on arguments (#13753)
---
 .../loadbalance/ConsistentHashLoadBalance.java     |  8 ++----
 .../loadbalance/ConsistentHashLoadBalanceTest.java | 33 ++++++++++++++++++++++
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalance.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalance.java
index 7fdfd8f79b..fb777ef03a 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalance.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalance.java
@@ -97,12 +97,10 @@ public class ConsistentHashLoadBalance extends 
AbstractLoadBalance {
         }
 
         public Invoker<T> select(Invocation invocation) {
-            byte[] digest = Bytes.getMD5(RpcUtils.getMethodName(invocation));
-            return selectForKey(hash(digest, 0));
-        }
+            String key = toKey(RpcUtils.getArguments(invocation));
 
-        private String toKey(Object[] args, boolean isGeneric) {
-            return isGeneric ? toKey((Object[]) args[1]) : toKey(args);
+            byte[] digest = Bytes.getMD5(key);
+            return selectForKey(hash(digest, 0));
         }
 
         private String toKey(Object[] args) {
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalanceTest.java
 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalanceTest.java
index 64641a5798..9e7c3cd2c2 100644
--- 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalanceTest.java
+++ 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalanceTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.rpc.cluster.loadbalance;
 
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.cluster.LoadBalance;
 import org.apache.dubbo.rpc.cluster.RouterChain;
@@ -25,11 +26,15 @@ import org.apache.dubbo.rpc.cluster.router.state.BitList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mock;
+
 @SuppressWarnings("rawtypes")
 class ConsistentHashLoadBalanceTest extends LoadBalanceBaseTest {
 
@@ -45,6 +50,34 @@ class ConsistentHashLoadBalanceTest extends 
LoadBalanceBaseTest {
         Assertions.assertEquals(hitted, genericHitted, "hitted should equals 
to genericHitted");
     }
 
+    @Test
+    void testArgumentMatchAll() {
+        Map<Invoker, AtomicLong> counter = new ConcurrentHashMap<Invoker, 
AtomicLong>();
+        LoadBalance lb = getLoadBalance(ConsistentHashLoadBalance.NAME);
+        for (Invoker invoker : invokers) {
+            counter.put(invoker, new AtomicLong(0));
+        }
+        URL url = invokers.get(0).getUrl();
+
+        for (int i = 0; i < 1000; i++) {
+            Invocation invocation = mock(Invocation.class);
+            String methodName = "method1";
+            given(invocation.getMethodName()).willReturn("$invoke");
+            String[] paraTypes = new String[] {String.class.getName(), 
String.class.getName(), String.class.getName()};
+            Object[] argsObject = new Object[] {"arg" + i, "arg2", "arg3"};
+            Object[] args = new Object[] {methodName, paraTypes, argsObject};
+            given(invocation.getArguments()).willReturn(args);
+
+            for (int j = 0; j < 5; j++) {
+                Invoker sinvoker = lb.select(invokers, url, invocation);
+                counter.get(sinvoker).incrementAndGet();
+            }
+        }
+        for (Invoker invoker : invokers) {
+            Assertions.assertTrue(counter.get(invoker).get() > 0);
+        }
+    }
+
     private Invoker findHitted(Map<Invoker, AtomicLong> invokerCounter) {
         Invoker invoker = null;
 

Reply via email to