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

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


The following commit(s) were added to refs/heads/3.3 by this push:
     new d0bf5c36d0 Fix mesh route match list semantics (#16377)
d0bf5c36d0 is described below

commit d0bf5c36d092da8067b15a1d1d00884a8c399e8e
Author: yin_bo_ <[email protected]>
AuthorDate: Tue Jul 14 10:34:04 2026 +0800

    Fix mesh route match list semantics (#16377)
---
 .../cluster/router/mesh/route/MeshRuleRouter.java  |  2 +-
 .../router/mesh/route/MeshRuleRouterTest.java      | 40 ++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java
index 06d43e9432..6737884c8d 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java
@@ -197,7 +197,7 @@ public abstract class MeshRuleRouter<T> extends 
AbstractStateRouter<T> implement
                 }
 
                 if (matchRequestList.stream()
-                        .allMatch(request -> request.isMatch(invocation, 
sourcesLabels, tracingContextProviders))) {
+                        .anyMatch(request -> request.isMatch(invocation, 
sourcesLabels, tracingContextProviders))) {
                     return dubboRouteDetail.getRoute();
                 }
             }
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouterTest.java
 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouterTest.java
index 2cf9da4cf2..ddf461700b 100644
--- 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouterTest.java
+++ 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouterTest.java
@@ -20,9 +20,11 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.utils.Holder;
+import org.apache.dubbo.common.utils.PojoUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.cluster.router.mesh.rule.virtualservice.DubboRoute;
 import org.apache.dubbo.rpc.cluster.router.mesh.util.TracingContextProvider;
 import org.apache.dubbo.rpc.cluster.router.state.BitList;
 import org.apache.dubbo.rpc.model.ApplicationModel;
@@ -46,6 +48,8 @@ import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.SafeConstructor;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -452,4 +456,40 @@ class MeshRuleRouterTest {
         invokers.removeAll(Arrays.asList(isolation, testingTrunk, testing));
         assertEquals(invokers, meshRuleRouter.route(invokers.clone(), null, 
rpcInvocation, false, null));
     }
+
+    @Test
+    void routeDetailShouldMatchWhenAnyRequestMatches() throws 
ReflectiveOperationException {
+        StandardMeshRuleRouter<Object> router = new 
StandardMeshRuleRouter<>(url.addParameter("trafficLabel", "gray"));
+
+        DubboRoute dubboRoute = createRouteWithAlternativeMatches();
+
+        RpcInvocation invocation =
+                new RpcInvocation(null, "sayHello", "DemoInterface", "", new 
Class<?>[0], new Object[0]);
+
+        assertNotNull(router.getDubboRouteDestination(dubboRoute, invocation));
+    }
+
+    @Test
+    void routeDetailShouldNotMatchWhenNoRequestMatches() throws 
ReflectiveOperationException {
+        StandardMeshRuleRouter<Object> router = new 
StandardMeshRuleRouter<>(url.addParameter("trafficLabel", "green"));
+
+        DubboRoute dubboRoute = createRouteWithAlternativeMatches();
+
+        RpcInvocation invocation =
+                new RpcInvocation(null, "sayHello", "DemoInterface", "", new 
Class<?>[0], new Object[0]);
+
+        assertNull(router.getDubboRouteDestination(dubboRoute, invocation));
+    }
+
+    private DubboRoute createRouteWithAlternativeMatches() throws 
ReflectiveOperationException {
+        Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions()));
+        Map<String, Object> rule = yaml.load("routedetail:\n"
+                + "  - match:\n"
+                + "      - sourceLabels: {trafficLabel: blue}\n"
+                + "      - sourceLabels: {trafficLabel: gray}\n"
+                + "    route:\n"
+                + "      - destination: {host: demo, subset: gray}\n");
+
+        return PojoUtils.mapToPojo(rule, DubboRoute.class);
+    }
 }

Reply via email to