From 51f5f5ee7d6b4b9fa9283656a9c2546ff5a2fa01 Mon Sep 17 00:00:00 2001 From: Daniil Zulin Date: Wed, 7 May 2025 16:11:41 +0700 Subject: [PATCH 1/2] Introduce equals/hashCode methods to classes used for the topic description --- .../tech/ydb/topic/description/Consumer.java | 20 ++++++++++ .../description/ConsumerDescription.java | 15 ++++++++ .../description/ConsumerPartitionInfo.java | 29 +++++++++++++++ .../description/MultipleWindowsStat.java | 16 ++++++++ .../ydb/topic/description/PartitionInfo.java | 19 ++++++++++ .../ydb/topic/description/PartitionStats.java | 27 ++++++++++++++ .../topic/description/SupportedCodecs.java | 15 ++++++++ .../topic/description/TopicDescription.java | 37 +++++++++++++++++++ .../ydb/topic/description/TopicStats.java | 18 +++++++++ .../ydb/topic/read/impl/OffsetsRangeImpl.java | 16 ++++++++ ...AutoPartitioningWriteStrategySettings.java | 17 +++++++++ .../topic/settings/PartitioningSettings.java | 19 ++++++++++ 12 files changed, 248 insertions(+) diff --git a/topic/src/main/java/tech/ydb/topic/description/Consumer.java b/topic/src/main/java/tech/ydb/topic/description/Consumer.java index 3dc85d45c..e20ca9f85 100644 --- a/topic/src/main/java/tech/ydb/topic/description/Consumer.java +++ b/topic/src/main/java/tech/ydb/topic/description/Consumer.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import javax.annotation.Nonnull; @@ -140,4 +141,23 @@ public Consumer build() { return new Consumer(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + Consumer consumer = (Consumer) o; + return important == consumer.important && + Objects.equals(name, consumer.name) && + Objects.equals(readFrom, consumer.readFrom) && + Objects.equals(supportedCodecs, consumer.supportedCodecs) && + Objects.equals(attributes, consumer.attributes) && + Objects.equals(stats, consumer.stats); + } + + @Override + public int hashCode() { + return Objects.hash(name, important, readFrom, supportedCodecs, attributes, stats); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java b/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java index 3a85494fe..68084c2aa 100644 --- a/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java +++ b/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java @@ -2,6 +2,7 @@ import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import tech.ydb.proto.topic.YdbTopic; @@ -28,4 +29,18 @@ public Consumer getConsumer() { public List getPartitions() { return partitions; } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + ConsumerDescription that = (ConsumerDescription) o; + return Objects.equals(consumer, that.consumer) && Objects.equals(partitions, that.partitions); + } + + @Override + public int hashCode() { + return Objects.hash(consumer, partitions); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java b/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java index 225c614da..babd11506 100644 --- a/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java +++ b/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java @@ -3,6 +3,7 @@ import java.time.Duration; import java.time.Instant; import java.util.List; +import java.util.Objects; import tech.ydb.core.utils.ProtobufUtils; import tech.ydb.proto.topic.YdbTopic; @@ -178,4 +179,32 @@ public int getConnectionNodeId() { return connectionNodeId; } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + ConsumerPartitionInfo that = (ConsumerPartitionInfo) o; + return partitionId == that.partitionId && + active == that.active && + Objects.equals(childPartitionIds, that.childPartitionIds) && + Objects.equals(parentPartitionIds, that.parentPartitionIds) && + Objects.equals(partitionStats, that.partitionStats) && + Objects.equals(consumerStats, that.consumerStats) && + Objects.equals(location, that.location); + } + + @Override + public int hashCode() { + return Objects.hash( + partitionId, + active, + childPartitionIds, + parentPartitionIds, + partitionStats, + consumerStats, + location + ); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java b/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java index 74a0c4f2a..dcbf1ac66 100644 --- a/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java +++ b/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java @@ -1,5 +1,7 @@ package tech.ydb.topic.description; +import java.util.Objects; + import tech.ydb.proto.topic.YdbTopic; /** @@ -33,4 +35,18 @@ public long getPerHour() { public long getPerDay() { return perDay; } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + MultipleWindowsStat that = (MultipleWindowsStat) o; + return perMinute == that.perMinute && perHour == that.perHour && perDay == that.perDay; + } + + @Override + public int hashCode() { + return Objects.hash(perMinute, perHour, perDay); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java b/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java index 1c16782f0..dc439191e 100644 --- a/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java +++ b/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import com.google.common.collect.ImmutableList; @@ -86,4 +87,22 @@ public PartitionInfo build() { return new PartitionInfo(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + PartitionInfo that = (PartitionInfo) o; + return partitionId == that.partitionId && + active == that.active && + Objects.equals(childPartitionIds, that.childPartitionIds) && + Objects.equals(parentPartitionIds, that.parentPartitionIds) && + Objects.equals(partitionStats, that.partitionStats); + } + + @Override + public int hashCode() { + return Objects.hash(partitionId, active, childPartitionIds, parentPartitionIds, partitionStats); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java b/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java index 78bde4ec1..8c4e27b35 100644 --- a/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java +++ b/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java @@ -2,6 +2,7 @@ import java.time.Duration; import java.time.Instant; +import java.util.Objects; import javax.annotation.Nullable; @@ -126,4 +127,30 @@ public PartitionStats build() { return new PartitionStats(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + PartitionStats that = (PartitionStats) o; + return storeSizeBytes == that.storeSizeBytes && + partitionNodeId == that.partitionNodeId && + Objects.equals(partitionOffsets, that.partitionOffsets) && + Objects.equals(lastWriteTime, that.lastWriteTime) && + Objects.equals(maxWriteTimeLag, that.maxWriteTimeLag) && + Objects.equals(bytesWritten, that.bytesWritten); + } + + @Override + public int hashCode() { + return Objects.hash( + partitionOffsets, + storeSizeBytes, + lastWriteTime, + maxWriteTimeLag, + bytesWritten, + partitionNodeId + ); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java b/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java index 09a4b126b..2fa1d088c 100644 --- a/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java +++ b/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import com.google.common.collect.ImmutableList; @@ -47,4 +48,18 @@ public SupportedCodecs build() { return new SupportedCodecs(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + SupportedCodecs that = (SupportedCodecs) o; + return Objects.equals(codecs, that.codecs); + } + + @Override + public int hashCode() { + return Objects.hashCode(codecs); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java b/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java index 3b228624d..024ccd709 100644 --- a/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java +++ b/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -179,4 +180,40 @@ public TopicDescription build() { return new TopicDescription(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + TopicDescription that = (TopicDescription) o; + return retentionStorageMb == that.retentionStorageMb && + partitionWriteSpeedBytesPerSecond == that.partitionWriteSpeedBytesPerSecond && + partitionWriteBurstBytes == that.partitionWriteBurstBytes && + Objects.equals(partitioningSettings, that.partitioningSettings) && + Objects.equals(partitions, that.partitions) && + Objects.equals(retentionPeriod, that.retentionPeriod) && + Objects.equals(supportedCodecs, that.supportedCodecs) && + Objects.equals(attributes, that.attributes) && + Objects.equals(consumers, that.consumers) && + meteringMode == that.meteringMode && + Objects.equals(topicStats, that.topicStats); + } + + @Override + public int hashCode() { + return Objects.hash( + partitioningSettings, + partitions, + retentionPeriod, + retentionStorageMb, + supportedCodecs, + partitionWriteSpeedBytesPerSecond, + partitionWriteBurstBytes, + attributes, + consumers, + meteringMode, + topicStats + ); + } } diff --git a/topic/src/main/java/tech/ydb/topic/description/TopicStats.java b/topic/src/main/java/tech/ydb/topic/description/TopicStats.java index f350660a1..5f7d77a2d 100644 --- a/topic/src/main/java/tech/ydb/topic/description/TopicStats.java +++ b/topic/src/main/java/tech/ydb/topic/description/TopicStats.java @@ -2,6 +2,7 @@ import java.time.Duration; import java.time.Instant; +import java.util.Objects; import javax.annotation.Nullable; @@ -76,4 +77,21 @@ public TopicStats build() { return new TopicStats(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + TopicStats that = (TopicStats) o; + return storeSizeBytes == that.storeSizeBytes && + Objects.equals(minLastWriteTime, that.minLastWriteTime) && + Objects.equals(maxWriteTimeLag, that.maxWriteTimeLag) && + Objects.equals(bytesWritten, that.bytesWritten); + } + + @Override + public int hashCode() { + return Objects.hash(storeSizeBytes, minLastWriteTime, maxWriteTimeLag, bytesWritten); + } } diff --git a/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java b/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java index 6cf1165ca..e85cad1a1 100644 --- a/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java +++ b/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java @@ -1,5 +1,7 @@ package tech.ydb.topic.read.impl; +import java.util.Objects; + import tech.ydb.topic.description.OffsetsRange; /** @@ -36,4 +38,18 @@ public void setStart(long start) { public void setEnd(long end) { this.end = end; } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + OffsetsRangeImpl that = (OffsetsRangeImpl) o; + return start == that.start && end == that.end; + } + + @Override + public int hashCode() { + return Objects.hash(start, end); + } } diff --git a/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java b/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java index 88db26fb1..c54ab0572 100644 --- a/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java +++ b/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java @@ -1,6 +1,7 @@ package tech.ydb.topic.settings; import java.time.Duration; +import java.util.Objects; public class AutoPartitioningWriteStrategySettings { private final Duration stabilizationWindow; @@ -69,4 +70,20 @@ public AutoPartitioningWriteStrategySettings build() { return new AutoPartitioningWriteStrategySettings(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + AutoPartitioningWriteStrategySettings that = (AutoPartitioningWriteStrategySettings) o; + return upUtilizationPercent == that.upUtilizationPercent && + downUtilizationPercent == that.downUtilizationPercent && + Objects.equals(stabilizationWindow, that.stabilizationWindow); + } + + @Override + public int hashCode() { + return Objects.hash(stabilizationWindow, upUtilizationPercent, downUtilizationPercent); + } } diff --git a/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java b/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java index e963babc2..d19f361eb 100644 --- a/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java +++ b/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java @@ -1,5 +1,7 @@ package tech.ydb.topic.settings; +import java.util.Objects; + /** * @author Nikolay Perfilov */ @@ -107,4 +109,21 @@ public PartitioningSettings build() { return new PartitioningSettings(this); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + PartitioningSettings that = (PartitioningSettings) o; + return minActivePartitions == that.minActivePartitions && + partitionCountLimit == that.partitionCountLimit && + autoPartitioningStrategy == that.autoPartitioningStrategy && + Objects.equals(writeStrategySettings, that.writeStrategySettings); + } + + @Override + public int hashCode() { + return Objects.hash(minActivePartitions, partitionCountLimit, autoPartitioningStrategy, writeStrategySettings); + } } From 3b5ce15d8357b721653290bdf80101a0196c71a2 Mon Sep 17 00:00:00 2001 From: Alexandr Gorshenin Date: Tue, 20 May 2025 13:50:57 +0100 Subject: [PATCH 2/2] Added check of self-equals --- topic/src/main/java/tech/ydb/topic/description/Consumer.java | 3 +++ .../java/tech/ydb/topic/description/ConsumerDescription.java | 3 +++ .../java/tech/ydb/topic/description/ConsumerPartitionInfo.java | 3 +++ .../java/tech/ydb/topic/description/MultipleWindowsStat.java | 3 +++ .../main/java/tech/ydb/topic/description/PartitionInfo.java | 3 +++ .../main/java/tech/ydb/topic/description/PartitionStats.java | 3 +++ .../main/java/tech/ydb/topic/description/SupportedCodecs.java | 3 +++ .../main/java/tech/ydb/topic/description/TopicDescription.java | 3 +++ topic/src/main/java/tech/ydb/topic/description/TopicStats.java | 3 +++ .../main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java | 3 +++ .../topic/settings/AutoPartitioningWriteStrategySettings.java | 3 +++ .../java/tech/ydb/topic/settings/PartitioningSettings.java | 3 +++ 12 files changed, 36 insertions(+) diff --git a/topic/src/main/java/tech/ydb/topic/description/Consumer.java b/topic/src/main/java/tech/ydb/topic/description/Consumer.java index e20ca9f85..90b3ca29b 100644 --- a/topic/src/main/java/tech/ydb/topic/description/Consumer.java +++ b/topic/src/main/java/tech/ydb/topic/description/Consumer.java @@ -144,6 +144,9 @@ public Consumer build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java b/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java index 68084c2aa..78fddf314 100644 --- a/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java +++ b/topic/src/main/java/tech/ydb/topic/description/ConsumerDescription.java @@ -32,6 +32,9 @@ public List getPartitions() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java b/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java index babd11506..19996fd32 100644 --- a/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java +++ b/topic/src/main/java/tech/ydb/topic/description/ConsumerPartitionInfo.java @@ -182,6 +182,9 @@ public int getConnectionNodeId() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java b/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java index dcbf1ac66..facb86fb6 100644 --- a/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java +++ b/topic/src/main/java/tech/ydb/topic/description/MultipleWindowsStat.java @@ -38,6 +38,9 @@ public long getPerDay() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java b/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java index dc439191e..e60d66121 100644 --- a/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java +++ b/topic/src/main/java/tech/ydb/topic/description/PartitionInfo.java @@ -90,6 +90,9 @@ public PartitionInfo build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java b/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java index 8c4e27b35..1e389eda3 100644 --- a/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java +++ b/topic/src/main/java/tech/ydb/topic/description/PartitionStats.java @@ -130,6 +130,9 @@ public PartitionStats build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java b/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java index 2fa1d088c..10eba9e57 100644 --- a/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java +++ b/topic/src/main/java/tech/ydb/topic/description/SupportedCodecs.java @@ -51,6 +51,9 @@ public SupportedCodecs build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java b/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java index 024ccd709..517fdd7e2 100644 --- a/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java +++ b/topic/src/main/java/tech/ydb/topic/description/TopicDescription.java @@ -183,6 +183,9 @@ public TopicDescription build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/description/TopicStats.java b/topic/src/main/java/tech/ydb/topic/description/TopicStats.java index 5f7d77a2d..6ff58db2d 100644 --- a/topic/src/main/java/tech/ydb/topic/description/TopicStats.java +++ b/topic/src/main/java/tech/ydb/topic/description/TopicStats.java @@ -80,6 +80,9 @@ public TopicStats build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java b/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java index e85cad1a1..b8e8290c4 100644 --- a/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java +++ b/topic/src/main/java/tech/ydb/topic/read/impl/OffsetsRangeImpl.java @@ -41,6 +41,9 @@ public void setEnd(long end) { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java b/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java index c54ab0572..044ac9cf0 100644 --- a/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java +++ b/topic/src/main/java/tech/ydb/topic/settings/AutoPartitioningWriteStrategySettings.java @@ -73,6 +73,9 @@ public AutoPartitioningWriteStrategySettings build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } diff --git a/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java b/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java index d19f361eb..460daf796 100644 --- a/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java +++ b/topic/src/main/java/tech/ydb/topic/settings/PartitioningSettings.java @@ -112,6 +112,9 @@ public PartitioningSettings build() { @Override public boolean equals(Object o) { + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; }