[
https://issues.apache.org/jira/browse/HDDS-16353?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18109735#comment-18109735
]
Chia-Chuan Ho commented on HDDS-16353:
--------------------------------------
Thanks for pointing this out. My understanding is that the values in nodeStatus
are mutable datanode report timestamps, while the datanode set represents the
part currently used by Pipeline.equals().
Would it make sense to keep the existing equals() semantics and update
hashCode() to use nodeStatus.keySet() instead of the complete map? We could
also add a regression test with the same datanodes but different report
timestamps, verifying that the pipelines remain equal and have the same hash
code.
Does this approach look reasonable to you?
> 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
>
> {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]