[
https://issues.apache.org/jira/browse/HDDS-16353?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18110115#comment-18110115
]
Chia-Chuan Ho commented on HDDS-16353:
--------------------------------------
Thanks [~szetszwo] for the guidance.
I have updated the implementation accordingly:
* Pipeline.hashCode() now uses only id.
* EqualsBuilder was replaced with direct comparisons while preserving the
existing equals() semantics.
* HashCodeBuilder was removed.
* A regression test was added for equal pipelines with different nodeStatus
values.
The change is available in PR #11179:
[https://github.com/apache/ozone/pull/11179]
PTAL when you have a chance. Thanks!
> 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
> Assignee: Chia-Chuan Ho
> Priority: Major
> Labels: pull-request-available
> 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]