From 198e4f801d53d7551d29937abb80bdafb22de6ad Mon Sep 17 00:00:00 2001 From: yin-bo-Final Date: Mon, 8 Jun 2026 02:25:31 +0800 Subject: [PATCH 1/4] Improve AddressMatch CIDR naming compatibility Add cidr accessors while keeping deprecated cird accessors for backward compatibility. Add tests for cidr and cird field mapping through PojoUtils. Refs #16314 --- .../virtualservice/match/AddressMatch.java | 38 ++++++++-- .../match/AddressMatchTest.java | 71 ++++++++++++++++--- .../apache/dubbo/common/utils/NetUtils.java | 2 +- 3 files changed, 95 insertions(+), 16 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatch.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatch.java index c4754d412db..76f68508d86 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatch.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatch.java @@ -31,7 +31,13 @@ public class AddressMatch { public static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(AddressMatch.class); private String wildcard; + private String cidr; + /** + * @deprecated use {@link #getCidr()} and {@link #setCidr(String)} instead. + */ + @Deprecated private String cird; + private String exact; public String getWildcard() { @@ -42,11 +48,29 @@ public void setWildcard(String wildcard) { this.wildcard = wildcard; } + public String getCidr() { + return cidr != null ? cidr : cird; + } + + public void setCidr(String cidr) { + this.cidr = cidr; + this.cird = cidr; + } + + /** + * @deprecated use {@link #getCidr()} instead. + */ + @Deprecated public String getCird() { - return cird; + return getCidr(); } + /** + * @deprecated use {@link #setCidr(String)} instead. + */ + @Deprecated public void setCird(String cird) { + this.cidr = cird; this.cird = cird; } @@ -59,17 +83,17 @@ public void setExact(String exact) { } public boolean isMatch(String input) { - if (getCird() != null && input != null) { + if (getCidr() != null && input != null) { try { - return input.equals(getCird()) || matchCird(input); + return input.equals(getCidr()) || matchCidr(input); } catch (UnknownHostException e) { logger.error( CLUSTER_FAILED_EXEC_CONDITION_ROUTER, "Executing routing rule match expression error.", "", String.format( - "Error trying to match cird formatted address %s with input %s in AddressMatch.", - getCird(), input), + "Error trying to match CIDR formatted address %s with input %s in AddressMatch.", + getCidr(), input), e); } } @@ -86,7 +110,7 @@ public boolean isMatch(String input) { return false; } - private boolean matchCird(String input) throws UnknownHostException { + private boolean matchCidr(String input) throws UnknownHostException { String host = input; int port = 0; int colonIndex = input.indexOf(':'); @@ -94,6 +118,6 @@ private boolean matchCird(String input) throws UnknownHostException { host = input.substring(0, colonIndex); port = StringUtils.parseInteger(input.substring(colonIndex + 1)); } - return matchIpExpression(getCird(), host, port); + return matchIpExpression(getCidr(), host, port); } } diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java index 9a49b426620..54c64a50107 100644 --- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java +++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java @@ -16,43 +16,98 @@ */ package org.apache.dubbo.rpc.cluster.router.mesh.rule.virtualservice.match; +import org.apache.dubbo.common.utils.PojoUtils; + +import java.util.HashMap; +import java.util.Map; + import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class AddressMatchTest { @Test - void cirdMatchIpv4AddressWithPort() { + void cidrMatchIpv4AddressWithPort() { AddressMatch addressMatch = new AddressMatch(); - addressMatch.setCird("192.168.1.*:90"); + addressMatch.setCidr("192.168.1.*:90"); assertTrue(addressMatch.isMatch("192.168.1.63:90")); assertFalse(addressMatch.isMatch("192.168.1.63:80")); } @Test - void cirdMatchIpv4AddressWithoutPort() { + void cidrMatchIpv4AddressWithoutPort() { AddressMatch addressMatch = new AddressMatch(); - addressMatch.setCird("192.168.1.*"); + addressMatch.setCidr("192.168.1.*"); assertTrue(addressMatch.isMatch("192.168.1.63")); } @Test - void cirdMatchExactAddress() { + void cidrMatchExactAddress() { AddressMatch addressMatch = new AddressMatch(); - addressMatch.setCird("192.168.1.63:90"); + addressMatch.setCidr("192.168.1.63:90"); assertTrue(addressMatch.isMatch("192.168.1.63:90")); } @Test - void cirdMatchIpv6Address() { + void cidrMatchIpv6Address() { AddressMatch addressMatch = new AddressMatch(); - addressMatch.setCird("234e:0:4567:0:0:0:3d:*"); + addressMatch.setCidr("234e:0:4567:0:0:0:3d:*"); assertTrue(addressMatch.isMatch("234e:0:4567::3d:ff")); } + + @Test + void cidrMatchInvalidAddressReturnsFalse() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setCidr("192.168.1.*"); + + assertFalse(addressMatch.isMatch("invalid host")); + } + + @Test + @SuppressWarnings("deprecation") + void deprecatedCirdAccessorsRemainCompatible() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setCird("192.168.1.*:90"); + + assertTrue(addressMatch.isMatch("192.168.1.63:90")); + assertEquals(addressMatch.getCidr(), addressMatch.getCird()); + } + + @Test + @SuppressWarnings("deprecation") + void cidrAndDeprecatedCirdAccessorsShareTheSameValue() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setCidr("192.168.1.*:90"); + addressMatch.setCird("10.0.0.*:20880"); + + assertEquals("10.0.0.*:20880", addressMatch.getCidr()); + assertEquals(addressMatch.getCidr(), addressMatch.getCird()); + } + + @Test + void cidrFieldCanBeMappedToPojo() throws ReflectiveOperationException { + Map map = new HashMap<>(); + map.put("cidr", "192.168.1.*:90"); + + AddressMatch addressMatch = PojoUtils.mapToPojo(map, AddressMatch.class); + + assertTrue(addressMatch.isMatch("192.168.1.63:90")); + } + + @Test + void deprecatedCirdFieldCanBeMappedToPojo() throws ReflectiveOperationException { + Map map = new HashMap<>(); + map.put("cird", "192.168.1.*:90"); + + AddressMatch addressMatch = PojoUtils.mapToPojo(map, AddressMatch.class); + + assertTrue(addressMatch.isMatch("192.168.1.63:90")); + } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java index c9ddff2a561..be4cd0adea0 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java @@ -724,7 +724,7 @@ public static void setInterface(MulticastSocket multicastSocket, boolean preferI /** * Check if address matches with specified pattern. * - * @param pattern cird pattern + * @param pattern CIDR pattern * @param address address * @return true if address matches with the pattern * @deprecated use {@link #matchIpExpression(String, String, int)} with separated host and port instead. From b430337f51b9bc3b81cb9addde1aac1c5c2cc35d Mon Sep 17 00:00:00 2001 From: yin-bo-Final Date: Mon, 8 Jun 2026 03:44:53 +0800 Subject: [PATCH 2/4] Add coverage for deprecated cird fallback --- .../rule/virtualservice/match/AddressMatchTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java index 54c64a50107..4313bad3a86 100644 --- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java +++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java @@ -91,6 +91,17 @@ void cidrAndDeprecatedCirdAccessorsShareTheSameValue() { assertEquals(addressMatch.getCidr(), addressMatch.getCird()); } + @Test + void cidrFallsBackToDeprecatedCirdField() throws ReflectiveOperationException { + AddressMatch addressMatch = new AddressMatch(); + java.lang.reflect.Field cirdField = AddressMatch.class.getDeclaredField("cird"); + cirdField.setAccessible(true); + cirdField.set(addressMatch, "192.168.1.*:90"); + + assertEquals("192.168.1.*:90", addressMatch.getCidr()); + assertTrue(addressMatch.isMatch("192.168.1.63:90")); + } + @Test void cidrFieldCanBeMappedToPojo() throws ReflectiveOperationException { Map map = new HashMap<>(); From f9fac78f41cdc6e3d90359030b42425cc1af905b Mon Sep 17 00:00:00 2001 From: yin-bo-Final Date: Mon, 8 Jun 2026 04:47:41 +0800 Subject: [PATCH 3/4] Cover AddressMatch wildcard and exact branches --- .../virtualservice/match/AddressMatchTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java index 4313bad3a86..8cde4a45d24 100644 --- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java +++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java @@ -70,6 +70,24 @@ void cidrMatchInvalidAddressReturnsFalse() { assertFalse(addressMatch.isMatch("invalid host")); } + @Test + void wildcardMatchAddress() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setWildcard("192.168.1.*"); + + assertTrue(addressMatch.isMatch("192.168.1.63")); + assertFalse(addressMatch.isMatch("10.0.0.1")); + } + + @Test + void exactMatchAddress() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setExact("192.168.1.63"); + + assertTrue(addressMatch.isMatch("192.168.1.63")); + assertFalse(addressMatch.isMatch("192.168.1.64")); + } + @Test @SuppressWarnings("deprecation") void deprecatedCirdAccessorsRemainCompatible() { From 284de4868be9582340f929b832648eaad626e5b3 Mon Sep 17 00:00:00 2001 From: yin-bo-Final Date: Mon, 8 Jun 2026 05:33:14 +0800 Subject: [PATCH 4/4] Cover AddressMatch null and any wildcard branches --- .../match/AddressMatchTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java index 8cde4a45d24..27dd93ae28b 100644 --- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java +++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/virtualservice/match/AddressMatchTest.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test; +import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE; +import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -70,6 +72,14 @@ void cidrMatchInvalidAddressReturnsFalse() { assertFalse(addressMatch.isMatch("invalid host")); } + @Test + void cidrMatchNullAddressReturnsFalse() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setCidr("192.168.1.*"); + + assertFalse(addressMatch.isMatch(null)); + } + @Test void wildcardMatchAddress() { AddressMatch addressMatch = new AddressMatch(); @@ -79,6 +89,25 @@ void wildcardMatchAddress() { assertFalse(addressMatch.isMatch("10.0.0.1")); } + @Test + void wildcardAnyAddressMatches() { + AddressMatch wildcardAny = new AddressMatch(); + wildcardAny.setWildcard(ANY_VALUE); + assertTrue(wildcardAny.isMatch("192.168.1.63")); + + AddressMatch wildcardAnyHost = new AddressMatch(); + wildcardAnyHost.setWildcard(ANYHOST_VALUE); + assertTrue(wildcardAnyHost.isMatch("192.168.1.63")); + } + + @Test + void wildcardMatchNullAddressReturnsFalse() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setWildcard("192.168.1.*"); + + assertFalse(addressMatch.isMatch(null)); + } + @Test void exactMatchAddress() { AddressMatch addressMatch = new AddressMatch(); @@ -88,6 +117,14 @@ void exactMatchAddress() { assertFalse(addressMatch.isMatch("192.168.1.64")); } + @Test + void exactMatchNullAddressReturnsFalse() { + AddressMatch addressMatch = new AddressMatch(); + addressMatch.setExact("192.168.1.63"); + + assertFalse(addressMatch.isMatch(null)); + } + @Test @SuppressWarnings("deprecation") void deprecatedCirdAccessorsRemainCompatible() {