[ 
https://issues.apache.org/jira/browse/HDDS-16353?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18109982#comment-18109982
 ] 

Tsz-wo Sze edited comment on HDDS-16353 at 8/31/26 5:21 PM:
------------------------------------------------------------

bq. Would it make sense to keep the existing equals() semantics and update 
hashCode() to use nodeStatus.keySet()  ...

For hashCode(), let's just use id but not other fields.

BTW, let's also get rid of EqualsBuilder and HashCodeBuilder.

!screenshot-1.png|width=600!


was (Author: szetszwo):
> Would it make sense to keep the existing equals() semantics and update 
> hashCode() to use nodeStatus.keySet()  ...

For hashCode(), let's just use the id.

BTW, let's also get rid of EqualsBuilder and HashCodeBuilder.

!screenshot-1.png|width=600!

> Pipeline violates the equals and hashCode contract
> --------------------------------------------------
>
>                 Key: HDDS-16353
>                 URL: https://issues.apache.org/jira/browse/HDDS-16353
>             Project: Apache Ozone
>          Issue Type: Bug
>          Components: common
>            Reporter: Tsz-wo Sze
>            Priority: Major
>         Attachments: screenshot-1.png
>
>
> {code}
> //Pipeline.java
>   @Override
>   public boolean equals(Object o) {
>     if (this == o) {
>       return true;
>     }
>     if (o == null || getClass() != o.getClass()) {
>       return false;
>     }
>     Pipeline that = (Pipeline) o;
>     return new EqualsBuilder()
>         .append(id, that.id)
>         .append(replicationConfig, that.replicationConfig)
>         .append(nodeStatus.keySet(), that.nodeStatus.keySet())
>         .isEquals();
>   }
>   @Override
>   public int hashCode() {
>     return new HashCodeBuilder()
>         .append(id)
>         .append(replicationConfig.getReplicationType())
>         .append(nodeStatus)
>         .toHashCode();
>   }
> {code}
> In the code above, hashCode() depends on nodeStatus but equals(..) depends 
> only on nodeStatus.keySet().  When two pipelines p1 and p2 have the same 
> nodeStatus.keySet() but different values, 
> - p1.equals(p2) returns true
> - but p1.hashCode() != p2.hashCode()
> It violates [the contract of 
> hashCode|https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--]:
> bq. If two objects are equal according to the equals(Object) method, then 
> calling the hashCode method on each of the two objects must produce the same 
> integer result. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to