Tsz-wo Sze created HDDS-16353:
---------------------------------

             Summary: 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


{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