This is an automated email from the ASF dual-hosted git repository. chia7712 pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/trunk by this push: new 2658f252389 KAFKA-19305 Make ClientQuotaImage and TopicImage immutable (#19847) 2658f252389 is described below commit 2658f2523899d74042f64a195329c573fcd3180b Author: Chang-Chi Hsu <47979664+jim0987795...@users.noreply.github.com> AuthorDate: Wed Jul 16 11:50:18 2025 +0800 KAFKA-19305 Make ClientQuotaImage and TopicImage immutable (#19847) - Updated `ClientQuotaImage` and `TopicImage` by using `Collections.unmodifiableMap` or `ImmutableMap` to prevent accidental or intentional mutations after construction. Reviewers: Alyssa Huang <ahu...@confluent.io>, Chia-Ping Tsai <chia7...@gmail.com> --- .../org/apache/kafka/image/ClientQuotaImage.java | 28 ++------------ .../java/org/apache/kafka/image/TopicImage.java | 43 ++-------------------- .../kafka/image/node/ClientQuotaImageNode.java | 4 +- 3 files changed, 9 insertions(+), 66 deletions(-) diff --git a/metadata/src/main/java/org/apache/kafka/image/ClientQuotaImage.java b/metadata/src/main/java/org/apache/kafka/image/ClientQuotaImage.java index 3e139925eb1..2161ae2621f 100644 --- a/metadata/src/main/java/org/apache/kafka/image/ClientQuotaImage.java +++ b/metadata/src/main/java/org/apache/kafka/image/ClientQuotaImage.java @@ -31,7 +31,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Objects; /** @@ -39,21 +38,11 @@ import java.util.Objects; * * This class is thread-safe. */ -public final class ClientQuotaImage { +public record ClientQuotaImage(Map<String, Double> quotas) { public static final ClientQuotaImage EMPTY = new ClientQuotaImage(Map.of()); - private final Map<String, Double> quotas; - - public ClientQuotaImage(Map<String, Double> quotas) { - this.quotas = quotas; - } - - Map<String, Double> quotas() { - return quotas; - } - - public Map<String, Double> quotaMap() { - return Collections.unmodifiableMap(quotas); + public ClientQuotaImage { + quotas = Collections.unmodifiableMap(quotas); } public void write( @@ -100,17 +89,6 @@ public final class ClientQuotaImage { return quotas.isEmpty(); } - @Override - public boolean equals(Object o) { - if (!(o instanceof ClientQuotaImage other)) return false; - return quotas.equals(other.quotas); - } - - @Override - public int hashCode() { - return Objects.hash(quotas); - } - @Override public String toString() { return new ClientQuotaImageNode(this).stringify(); diff --git a/metadata/src/main/java/org/apache/kafka/image/TopicImage.java b/metadata/src/main/java/org/apache/kafka/image/TopicImage.java index 48c71b7da89..734523a4493 100644 --- a/metadata/src/main/java/org/apache/kafka/image/TopicImage.java +++ b/metadata/src/main/java/org/apache/kafka/image/TopicImage.java @@ -24,9 +24,9 @@ import org.apache.kafka.image.writer.ImageWriter; import org.apache.kafka.image.writer.ImageWriterOptions; import org.apache.kafka.metadata.PartitionRegistration; +import java.util.Collections; import java.util.Map; import java.util.Map.Entry; -import java.util.Objects; /** @@ -34,31 +34,9 @@ import java.util.Objects; * * This class is thread-safe. */ -public final class TopicImage { - private final String name; - - private final Uuid id; - - private final Map<Integer, PartitionRegistration> partitions; - - public TopicImage(String name, - Uuid id, - Map<Integer, PartitionRegistration> partitions) { - this.name = name; - this.id = id; - this.partitions = partitions; - } - - public String name() { - return name; - } - - public Uuid id() { - return id; - } - - public Map<Integer, PartitionRegistration> partitions() { - return partitions; +public record TopicImage(String name, Uuid id, Map<Integer, PartitionRegistration> partitions) { + public TopicImage { + partitions = Collections.unmodifiableMap(partitions); } public void write(ImageWriter writer, ImageWriterOptions options) { @@ -72,19 +50,6 @@ public final class TopicImage { } } - @Override - public boolean equals(Object o) { - if (!(o instanceof TopicImage other)) return false; - return name.equals(other.name) && - id.equals(other.id) && - partitions.equals(other.partitions); - } - - @Override - public int hashCode() { - return Objects.hash(name, id, partitions); - } - @Override public String toString() { return new TopicImageNode(this).stringify(); diff --git a/metadata/src/main/java/org/apache/kafka/image/node/ClientQuotaImageNode.java b/metadata/src/main/java/org/apache/kafka/image/node/ClientQuotaImageNode.java index 725c5620ed9..45907fc8c66 100644 --- a/metadata/src/main/java/org/apache/kafka/image/node/ClientQuotaImageNode.java +++ b/metadata/src/main/java/org/apache/kafka/image/node/ClientQuotaImageNode.java @@ -34,12 +34,12 @@ public class ClientQuotaImageNode implements MetadataNode { @Override public Collection<String> childNames() { - return image.quotaMap().keySet(); + return image.quotas().keySet(); } @Override public MetadataNode child(String name) { - Double result = image.quotaMap().get(name); + Double result = image.quotas().get(name); if (result == null) return null; return new MetadataLeafNode(result + ""); }