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]