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

albumenj 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 dd94c1561a fix router match condition (#12491)
dd94c1561a is described below

commit dd94c1561ade672cc253eef79828f6d2daf5a676
Author: Ken Liu <[email protected]>
AuthorDate: Mon Jun 12 20:48:03 2023 +0800

    fix router match condition (#12491)
    
    * fix router match condition
    
    * fix ut compilation
    
    * add null check
---
 .../cluster/configurator/AbstractConfigurator.java |  2 +-
 .../configurator/parser/model/ConditionMatch.java  | 18 +++++++++++++--
 .../configurator/parser/model/ParamMatch.java      |  4 ++--
 .../rpc/cluster/router/tag/model/ParamMatch.java   |  2 +-
 .../configurator/parser/ConfigParserTest.java      | 18 +++++++--------
 .../dubbo/metadata/AbstractServiceNameMapping.java | 26 ++++++++++++----------
 .../registry/client/ServiceDiscoveryRegistry.java  |  4 +++-
 7 files changed, 46 insertions(+), 28 deletions(-)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
index 55ebed253c..1a6b1381b9 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
@@ -128,7 +128,7 @@ public abstract class AbstractConfigurator implements 
Configurator {
                 if (apiVersion != null && 
apiVersion.startsWith(RULE_VERSION_V30)) {
                     ConditionMatch matcher = (ConditionMatch) 
configuratorUrl.getAttribute(MATCH_CONDITION);
                     if (matcher != null) {
-                        if (matcher.isMatch(url)) {
+                        if (matcher.isMatch(host, url)) {
                             return doConfigure(url, 
configuratorUrl.removeParameters(conditionKeys));
                         } else {
                             logger.debug("Cannot apply configurator rule, 
param mismatch, current params are " + url + ", params in rule is " + matcher);
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java
index b16c2c978a..4a828d4484 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConditionMatch.java
@@ -26,6 +26,7 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
 
 public class ConditionMatch {
     private AddressMatch address;
+    private AddressMatch providerAddress;
     private ListStringMatch service;
     private ListStringMatch app;
     private List<ParamMatch> param;
@@ -38,6 +39,14 @@ public class ConditionMatch {
         this.address = address;
     }
 
+    public AddressMatch getProviderAddress() {
+        return providerAddress;
+    }
+
+    public void setProviderAddress(AddressMatch providerAddress) {
+        this.providerAddress = providerAddress;
+    }
+
     public ListStringMatch getService() {
         return service;
     }
@@ -62,8 +71,12 @@ public class ConditionMatch {
         this.param = param;
     }
 
-    public boolean isMatch(URL url) {
-        if (getAddress() != null && !getAddress().isMatch(url.getAddress())) {
+    public boolean isMatch(String host, URL url) {
+        if (getAddress() != null && !getAddress().isMatch(host)) {
+            return false;
+        }
+
+        if (getProviderAddress() != null && 
!getProviderAddress().isMatch(url.getAddress())) {
             return false;
         }
 
@@ -90,6 +103,7 @@ public class ConditionMatch {
     public String toString() {
         return "ConditionMatch{" +
             "address='" + address + '\'' +
+            "providerAddress='" + providerAddress + '\'' +
             ", service='" + service + '\'' +
             ", app='" + app + '\'' +
             ", param='" + param + '\'' +
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java
index 0f1501cb69..42303e6a49 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ParamMatch.java
@@ -40,12 +40,12 @@ public class ParamMatch {
     }
 
     public boolean isMatch(URL url) {
-        if (key == null) {
+        if (key == null || value == null) {
             return false;
         }
 
         String input = url.getParameter(key);
-        return input != null && value.isMatch(input);
+        return value.isMatch(input);
     }
 
     @Override
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java
index bef3366e83..bab1284436 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/ParamMatch.java
@@ -39,7 +39,7 @@ public class ParamMatch {
     }
 
     public boolean isMatch(String input) {
-        if (getValue() != null && input != null) {
+        if (getValue() != null) {
             return getValue().isMatch(input);
         }
         return false;
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
index dd30a0a037..f5596d56b4 100644
--- 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
+++ 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
@@ -187,11 +187,11 @@ class ConfigParserTest {
             URL notMatchURL3 = 
URL.valueOf("dubbo://10.0.0.1:20880/DemoService?match_key1=value_not_match");// 
key not match
 
             ConditionMatch matcher = (ConditionMatch) 
url.getAttribute(MATCH_CONDITION);
-            Assertions.assertTrue(matcher.isMatch(matchURL1));
-            Assertions.assertTrue(matcher.isMatch(matchURL2));
-            Assertions.assertFalse(matcher.isMatch(notMatchURL1));
-            Assertions.assertFalse(matcher.isMatch(notMatchURL2));
-            Assertions.assertFalse(matcher.isMatch(notMatchURL3));
+            Assertions.assertTrue(matcher.isMatch(matchURL1.getAddress(), 
matchURL1));
+            Assertions.assertTrue(matcher.isMatch(matchURL2.getAddress(), 
matchURL2));
+            Assertions.assertFalse(matcher.isMatch(notMatchURL1.getAddress(), 
notMatchURL1));
+            Assertions.assertFalse(matcher.isMatch(notMatchURL2.getAddress(), 
notMatchURL2));
+            Assertions.assertFalse(matcher.isMatch(notMatchURL3.getAddress(), 
notMatchURL3));
         }
     }
 
@@ -211,8 +211,8 @@ class ConfigParserTest {
             URL notMatchURL = 
URL.valueOf("dubbo://10.0.0.1:20880/DemoService?match_key1=value_not_match");// 
key not match
 
             ConditionMatch matcher = (ConditionMatch) 
url.getAttribute(MATCH_CONDITION);
-            Assertions.assertTrue(matcher.isMatch(matchURL));
-            Assertions.assertFalse(matcher.isMatch(notMatchURL));
+            Assertions.assertTrue(matcher.isMatch(matchURL.getAddress(), 
matchURL));
+            Assertions.assertFalse(matcher.isMatch(notMatchURL.getAddress(), 
notMatchURL));
         }
     }
 
@@ -232,8 +232,8 @@ class ConfigParserTest {
             URL notMatchURL = 
URL.valueOf("dubbo://10.0.0.1:20880/DemoService?match_key1=value_not_match");// 
key not match
 
             ConditionMatch matcher = (ConditionMatch) 
url.getAttribute(MATCH_CONDITION);
-            Assertions.assertTrue(matcher.isMatch(matchURL));
-            Assertions.assertFalse(matcher.isMatch(notMatchURL));
+            Assertions.assertTrue(matcher.isMatch(matchURL.getAddress(), 
matchURL));
+            Assertions.assertFalse(matcher.isMatch(notMatchURL.getAddress(), 
notMatchURL));
         }
     }
 
diff --git 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
index 675067276d..6ed85622ee 100644
--- 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
+++ 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
@@ -124,18 +124,20 @@ public abstract class AbstractServiceNameMapping 
implements ServiceNameMapping {
     @Override
     public MappingListener stopListen(URL subscribeURL, MappingListener 
listener) {
         synchronized (mappingListeners) {
-            String mappingKey = 
ServiceNameMapping.buildMappingKey(subscribeURL);
-            Set<MappingListener> listeners = mappingListeners.get(mappingKey);
-            //todo, remove listener from remote metadata center
-            if (CollectionUtils.isNotEmpty(listeners)) {
-                listeners.remove(listener);
-                listener.stop();
-                removeListener(subscribeURL, listener);
-            }
-            if (CollectionUtils.isEmpty(listeners)) {
-                mappingListeners.remove(mappingKey);
-                removeCachedMapping(mappingKey);
-                removeMappingLock(mappingKey);
+            if (listener != null) {
+                String mappingKey = 
ServiceNameMapping.buildMappingKey(subscribeURL);
+                Set<MappingListener> listeners = 
mappingListeners.get(mappingKey);
+                //todo, remove listener from remote metadata center
+                if (CollectionUtils.isNotEmpty(listeners)) {
+                    listeners.remove(listener);
+                    listener.stop();
+                    removeListener(subscribeURL, listener);
+                }
+                if (CollectionUtils.isEmpty(listeners)) {
+                    mappingListeners.remove(mappingKey);
+                    removeCachedMapping(mappingKey);
+                    removeMappingLock(mappingKey);
+                }
             }
             return listener;
         }
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
index 003892c6ca..d808a05b97 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
@@ -248,7 +248,9 @@ public class ServiceDiscoveryRegistry extends 
FailbackRegistry {
         serviceDiscovery.unsubscribe(url, listener);
         String protocolServiceKey = url.getProtocolServiceKey();
         Set<String> serviceNames = serviceNameMapping.getMapping(url);
-        serviceNameMapping.stopListen(url, 
mappingListeners.remove(protocolServiceKey));
+        if (mappingListeners.get(protocolServiceKey) != null) {
+            serviceNameMapping.stopListen(url, 
mappingListeners.remove(protocolServiceKey));
+        }
         if (CollectionUtils.isNotEmpty(serviceNames)) {
             String serviceNamesKey = toStringKeys(serviceNames);
             Lock appSubscriptionLock = getAppSubscription(serviceNamesKey);

Reply via email to