diff --git a/0011-ConfigEntry.patch b/0011-ConfigEntry.patch new file mode 100644 index 0000000000000000000000000000000000000000..2b8367d7443a717d1fd6649b95bd2b453ec0b734 --- /dev/null +++ b/0011-ConfigEntry.patch @@ -0,0 +1,92 @@ +diff --git a/clients/src/main/java/org/apache/kafka/clients/admin/ConfigEntry.java b/clients/src/main/java/org/apache/kafka/clients/admin/ConfigEntry.java +index 8f058a2d6c..8f3b336911 100644 +--- a/clients/src/main/java/org/apache/kafka/clients/admin/ConfigEntry.java ++++ b/clients/src/main/java/org/apache/kafka/clients/admin/ConfigEntry.java +@@ -171,11 +171,13 @@ public class ConfigEntry { + ConfigEntry that = (ConfigEntry) o; + + return this.name.equals(that.name) && +- this.value != null ? this.value.equals(that.value) : that.value == null && ++ Objects.equals(this.value, that.value) && + this.isSensitive == that.isSensitive && + this.isReadOnly == that.isReadOnly && +- this.source == that.source && +- Objects.equals(this.synonyms, that.synonyms); ++ Objects.equals(this.source, that.source) && ++ Objects.equals(this.synonyms, that.synonyms) && ++ Objects.equals(this.type, that.type) && ++ Objects.equals(this.documentation, that.documentation); + } + + @Override +@@ -183,11 +185,13 @@ public class ConfigEntry { + final int prime = 31; + int result = 1; + result = prime * result + name.hashCode(); +- result = prime * result + ((value == null) ? 0 : value.hashCode()); +- result = prime * result + (isSensitive ? 1 : 0); ++ result = prime * result + Objects.hashCode(value); ++ result = prime * result + (isSensitive ? 1 : 0); + result = prime * result + (isReadOnly ? 1 : 0); +- result = prime * result + source.hashCode(); +- result = prime * result + synonyms.hashCode(); ++ result = prime * result + Objects.hashCode(source); ++ result = prime * result + Objects.hashCode(synonyms); ++ result = prime * result + Objects.hashCode(type); ++ result = prime * result + Objects.hashCode(documentation); + return result; + } + +@@ -204,6 +208,8 @@ public class ConfigEntry { + ", isSensitive=" + isSensitive + + ", isReadOnly=" + isReadOnly + + ", synonyms=" + synonyms + ++ ", type=" + type + ++ ", documentation=" + documentation + + ")"; + } + +diff --git a/clients/src/test/java/org/apache/kafka/clients/admin/ConfigTest.java b/clients/src/test/java/org/apache/kafka/clients/admin/ConfigTest.java +index 4008a54382..59d1150ac3 100644 +--- a/clients/src/test/java/org/apache/kafka/clients/admin/ConfigTest.java ++++ b/clients/src/test/java/org/apache/kafka/clients/admin/ConfigTest.java +@@ -82,4 +82,19 @@ public class ConfigTest { + boolean isReadOnly, List synonyms) { + return new ConfigEntry(name, value, source, isSensitive, isReadOnly, synonyms, ConfigType.UNKNOWN, null); + } ++ ++ @Test ++ public void testHashCodeAndEqualsWithNull() { ++ ConfigEntry ce0 = new ConfigEntry("abc", null, null, false, false, null, null, null); ++ ConfigEntry ce1 = new ConfigEntry("abc", null, null, false, false, null, null, null); ++ assertEquals(ce0, ce1); ++ assertEquals(ce0.hashCode(), ce1.hashCode()); ++ } ++ ++ @Test ++ public void testEquals() { ++ ConfigEntry ce0 = new ConfigEntry("abc", null, ConfigEntry.ConfigSource.DEFAULT_CONFIG, false, false, null, null, null); ++ ConfigEntry ce1 = new ConfigEntry("abc", null, ConfigEntry.ConfigSource.DYNAMIC_BROKER_CONFIG, false, false, null, null, null); ++ assertNotEquals(ce0, ce1); ++ } + } +diff --git a/core/src/test/scala/unit/kafka/admin/ConfigCommandTest.scala b/core/src/test/scala/unit/kafka/admin/ConfigCommandTest.scala +index 8603fbec78..66b7fb1cc9 100644 +--- a/core/src/test/scala/unit/kafka/admin/ConfigCommandTest.scala ++++ b/core/src/test/scala/unit/kafka/admin/ConfigCommandTest.scala +@@ -803,7 +803,14 @@ class ConfigCommandTest extends ZooKeeperTestHarness with Logging { + new AlterConfigOp(newConfigEntry("min.insync.replicas", "2"), AlterConfigOp.OpType.SET), + new AlterConfigOp(newConfigEntry("unclean.leader.election.enable", ""), AlterConfigOp.OpType.DELETE) + ) +- assertEquals(expectedConfigOps, alterConfigOps.asScala.toSet) ++ assertEquals(expectedConfigOps.size, alterConfigOps.size) ++ expectedConfigOps.foreach { expectedOp => ++ val actual = alterConfigOps.asScala.find(_.configEntry.name == expectedOp.configEntry.name) ++ assertNotEquals(actual, None) ++ assertEquals(expectedOp.opType, actual.get.opType) ++ assertEquals(expectedOp.configEntry.name, actual.get.configEntry.name) ++ assertEquals(expectedOp.configEntry.value, actual.get.configEntry.value) ++ } + alteredConfigs = true + alterResult + } diff --git a/kafka.spec b/kafka.spec index a779f28afe9dd84cba7a5c1f1397e56a83ebb90a..94fb164dd2a3b512ee5cc12b9ac3eb52114bb537 100644 --- a/kafka.spec +++ b/kafka.spec @@ -4,7 +4,7 @@ Name: kafka Version: 2.8.2 -Release: 10 +Release: 11 Summary: A Distributed Streaming Platform. License: Apache-2.0 @@ -22,6 +22,7 @@ Patch6: 0007-fix-payload-incorrectly.patch Patch7: 0008-Cast-SMT-allow-null.patch Patch8: 0009-format-RocksDBConfigSetter.patch Patch9: 0010-not-update-connection.patch +Patch10: 0011-ConfigEntry.patch BuildRequires: systemd java-1.8.0-openjdk-devel Provides: kafka = %{version} @@ -73,6 +74,8 @@ cp -pr licenses/* $RPM_BUILD_ROOT%{kafka_home}/licenses rm -rf %{buildroot} %changelog +* Fri Dec 08 2023 sundapeng - 2.8.2-11 +- ConfigEntry#equal does not compare other fields when value is NOT null * Fri Dec 08 2023 sundapeng - 2.8.2-10 - Don't update connection idle time for muted connections * Fri Dec 08 2023 sundapeng - 2.8.2-9