Copilot commented on code in PR #15633:
URL: https://github.com/apache/dubbo/pull/15633#discussion_r2279067318


##########
dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java:
##########
@@ -305,28 +308,47 @@ public boolean equals(Object o) {
             return false;
         }
         DefaultServiceInstance that = (DefaultServiceInstance) o;
-        boolean equals = Objects.equals(getServiceName(), 
that.getServiceName())
-                && Objects.equals(getHost(), that.getHost())
-                && Objects.equals(getPort(), that.getPort());
+        if (!Objects.equals(getServiceName(), that.getServiceName())
+                || !Objects.equals(getHost(), that.getHost())
+                || !Objects.equals(getPort(), that.getPort())) {
+            return false;
+        }
+
+        Set<String> checkedKeys = new HashSet<>(this.getMetadata().size());
         for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {
-            if 
(entry.getKey().equals(EXPORTED_SERVICES_REVISION_PROPERTY_NAME)) {
+            String key = entry.getKey();
+            checkedKeys.add(key);
+            if (key.equals(EXPORTED_SERVICES_REVISION_PROPERTY_NAME) || 
key.equals(TIMESTAMP_KEY)) {
                 continue;
             }
-            if (entry.getValue() == null) {
-                equals = equals && (entry.getValue() == 
that.getMetadata().get(entry.getKey()));
-            } else {
-                equals = equals && 
entry.getValue().equals(that.getMetadata().get(entry.getKey()));
+            if (!Objects.equals(entry.getValue(), 
that.getMetadata().get(key))) {
+                return false;
+            }
+        }
+
+        for (Map.Entry<String, String> thatEntry : 
that.getMetadata().entrySet()) {
+            String thatKey = thatEntry.getKey();
+            if (checkedKeys.contains(thatKey)
+                    || thatKey.equals(EXPORTED_SERVICES_REVISION_PROPERTY_NAME)
+                    || thatKey.equals(TIMESTAMP_KEY)) {
+                continue;
             }
+            // Return false if 'that' contains a key not present in 'this' 
regardless of the entry value.
+            // This ensures consistency with hashCode, as any extra key in 
'that' would result in a different hashCode.
+            return false;
         }
 
-        return equals;
+        return true;
     }
 
     @Override
     public int hashCode() {
         int result = Objects.hash(getServiceName(), getHost(), getPort());
-        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {
-            if 
(entry.getKey().equals(EXPORTED_SERVICES_REVISION_PROPERTY_NAME)) {
+
+        // sort metadata to ensure the result is calculated by the same order.
+        for (Map.Entry<String, String> entry : 
this.getSortedMetadata().entrySet()) {

Review Comment:
   The method `getSortedMetadata()` is being called but is not visible in the 
diff or context. Ensure this method exists and returns a sorted map of 
metadata. If it doesn't exist, this will cause a compilation error.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org
For additional commands, e-mail: notifications-h...@dubbo.apache.org

Reply via email to