You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by sa...@apache.org on 2024/06/11 07:12:54 UTC

(kafka) 06/12: KAFKA-16880 Update equals and hashcode methods for two attributes (#16173)

This is an automated email from the ASF dual-hosted git repository.

satishd pushed a commit to branch 3.8
in repository https://gitbox.apache.org/repos/asf/kafka.git

commit 944f4699a7de443a72fa2618b5cbc8531f12a8c4
Author: Murali Basani <mu...@aiven.io>
AuthorDate: Tue Jun 4 08:05:00 2024 +0200

    KAFKA-16880 Update equals and hashcode methods for two attributes  (#16173)
    
    Reviewers: Kamal Chandraprakash <ka...@gmail.com>, Chia-Ping Tsai <ch...@gmail.com>
---
 .../log/remote/storage/RemoteLogManagerConfig.java |   5 +-
 .../remote/storage/RemoteLogManagerConfigTest.java | 107 +++++++++++++++++++--
 2 files changed, 102 insertions(+), 10 deletions(-)

diff --git a/storage/src/main/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfig.java b/storage/src/main/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfig.java
index d6cf615c781..1add933d788 100644
--- a/storage/src/main/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfig.java
+++ b/storage/src/main/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfig.java
@@ -585,6 +585,8 @@ public final class RemoteLogManagerConfig {
         return enableRemoteStorageSystem == that.enableRemoteStorageSystem
                 && remoteLogIndexFileCacheTotalSizeBytes == that.remoteLogIndexFileCacheTotalSizeBytes
                 && remoteLogManagerThreadPoolSize == that.remoteLogManagerThreadPoolSize
+                && remoteLogManagerCopierThreadPoolSize == that.remoteLogManagerCopierThreadPoolSize
+                && remoteLogManagerExpirationThreadPoolSize == that.remoteLogManagerExpirationThreadPoolSize
                 && remoteLogManagerTaskIntervalMs == that.remoteLogManagerTaskIntervalMs
                 && remoteLogManagerTaskRetryBackoffMs == that.remoteLogManagerTaskRetryBackoffMs
                 && remoteLogManagerTaskRetryBackoffMaxMs == that.remoteLogManagerTaskRetryBackoffMaxMs
@@ -613,7 +615,8 @@ public final class RemoteLogManagerConfig {
     public int hashCode() {
         return Objects.hash(enableRemoteStorageSystem, remoteStorageManagerClassName, remoteStorageManagerClassPath,
                             remoteLogMetadataManagerClassName, remoteLogMetadataManagerClassPath, remoteLogMetadataManagerListenerName,
-                            remoteLogMetadataCustomMetadataMaxBytes, remoteLogIndexFileCacheTotalSizeBytes, remoteLogManagerThreadPoolSize, remoteLogManagerTaskIntervalMs,
+                            remoteLogMetadataCustomMetadataMaxBytes, remoteLogIndexFileCacheTotalSizeBytes, remoteLogManagerThreadPoolSize,
+                            remoteLogManagerCopierThreadPoolSize, remoteLogManagerExpirationThreadPoolSize, remoteLogManagerTaskIntervalMs,
                             remoteLogManagerTaskRetryBackoffMs, remoteLogManagerTaskRetryBackoffMaxMs, remoteLogManagerTaskRetryJitter,
                             remoteLogReaderThreads, remoteLogReaderMaxPendingTasks, remoteStorageManagerProps, remoteLogMetadataManagerProps,
                             remoteStorageManagerPrefix, remoteLogMetadataManagerPrefix, remoteLogManagerCopyMaxBytesPerSecond,
diff --git a/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfigTest.java b/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfigTest.java
index 4e3c2fc26cb..d04c42409b2 100644
--- a/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfigTest.java
+++ b/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerConfigTest.java
@@ -17,7 +17,7 @@
 package org.apache.kafka.server.log.remote.storage;
 
 import org.apache.kafka.common.config.AbstractConfig;
-import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 
@@ -27,6 +27,8 @@ import java.util.Map;
 
 import static org.apache.kafka.server.log.remote.storage.RemoteLogManagerConfig.DEFAULT_REMOTE_LOG_METADATA_MANAGER_CLASS_NAME;
 import static org.apache.kafka.server.log.remote.storage.RemoteLogManagerConfig.REMOTE_LOG_METADATA_MANAGER_CLASS_NAME_PROP;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
 
 public class RemoteLogManagerConfigTest {
 
@@ -43,13 +45,11 @@ public class RemoteLogManagerConfigTest {
         String rlmmPrefix = "__custom.rlmm.";
         Map<String, Object> rsmProps = Collections.singletonMap("rsm.prop", "val");
         Map<String, Object> rlmmProps = Collections.singletonMap("rlmm.prop", "val");
-        String remoteLogMetadataManagerClass = useDefaultRemoteLogMetadataManagerClass ? DEFAULT_REMOTE_LOG_METADATA_MANAGER_CLASS_NAME : "dummy.remote.log.metadata.class";
-        RemoteLogManagerConfig expectedRemoteLogManagerConfig
-                = new RemoteLogManagerConfig(true, "dummy.remote.storage.class", "dummy.remote.storage.class.path",
-                                             remoteLogMetadataManagerClass, "dummy.remote.log.metadata.class.path",
-                                             "listener.name", 1024 * 1024L, 1, 1, 1, 60000L, 100L, 60000L, 0.3, 10, 100, 100,
-                                             rsmPrefix, rsmProps, rlmmPrefix, rlmmProps, Long.MAX_VALUE, 11, 1,
-                                             Long.MAX_VALUE, 11, 1);
+        RemoteLogManagerConfig expectedRemoteLogManagerConfig = getRemoteLogManagerConfig(useDefaultRemoteLogMetadataManagerClass,
+                rsmPrefix,
+                rlmmPrefix,
+                rsmProps,
+                rlmmProps);
 
         Map<String, Object> props = extractProps(expectedRemoteLogManagerConfig);
         rsmProps.forEach((k, v) -> props.put(rsmPrefix + k, v));
@@ -60,7 +60,42 @@ public class RemoteLogManagerConfigTest {
         }
         TestConfig config = new TestConfig(props);
         RemoteLogManagerConfig remoteLogManagerConfig = new RemoteLogManagerConfig(config);
-        Assertions.assertEquals(expectedRemoteLogManagerConfig, remoteLogManagerConfig);
+        assertEquals(expectedRemoteLogManagerConfig, remoteLogManagerConfig);
+    }
+
+    private static RemoteLogManagerConfig getRemoteLogManagerConfig(boolean useDefaultRemoteLogMetadataManagerClass,
+                                                                    String rsmPrefix,
+                                                                    String rlmmPrefix,
+                                                                    Map<String, Object> rsmProps,
+                                                                    Map<String, Object> rlmmProps) {
+        String remoteLogMetadataManagerClass = useDefaultRemoteLogMetadataManagerClass ? DEFAULT_REMOTE_LOG_METADATA_MANAGER_CLASS_NAME : "dummy.remote.log.metadata.class";
+        return new RemoteLogManagerConfig(true,
+                "dummy.remote.storage.class",
+                "dummy.remote.storage.class.path",
+                remoteLogMetadataManagerClass,
+                "dummy.remote.log.metadata.class.path",
+                "listener.name",
+                1024 * 1024L,
+                1,
+                1,
+                1,
+                60000L,
+                100L,
+                60000L,
+                0.3,
+                10,
+                100,
+                100,
+                rsmPrefix,
+                rsmProps,
+                rlmmPrefix,
+                rlmmProps,
+                Long.MAX_VALUE,
+                11,
+                1,
+                Long.MAX_VALUE,
+                11,
+                1);
     }
 
     private Map<String, Object> extractProps(RemoteLogManagerConfig remoteLogManagerConfig) {
@@ -105,4 +140,58 @@ public class RemoteLogManagerConfigTest {
                   remoteLogManagerConfig.remoteLogMetadataManagerPrefix());
         return props;
     }
+
+    @Test
+    public void testHashCodeAndEquals_ForAllAndTwoFields() {
+        String rsmPrefix = "__custom.rsm.";
+        String rlmmPrefix = "__custom.rlmm.";
+        Map<String, Object> rsmProps = Collections.singletonMap("rsm.prop", "val");
+        Map<String, Object> rlmmProps = Collections.singletonMap("rlmm.prop", "val");
+        RemoteLogManagerConfig config1 = getRemoteLogManagerConfig(false,
+                rsmPrefix,
+                rlmmPrefix,
+                rsmProps,
+                rlmmProps);
+        RemoteLogManagerConfig config2 = getRemoteLogManagerConfig(false,
+                rsmPrefix,
+                rlmmPrefix,
+                rsmProps,
+                rlmmProps);
+
+        // Initially, hash codes should be equal for default objects
+        assertEquals(config1.hashCode(), config2.hashCode());
+
+        // Initially, objects should be equal
+        assertEquals(config1, config2);
+
+        // Test for specific field remoteLogManagerCopierThreadPoolSize
+        RemoteLogManagerConfig config3 = new RemoteLogManagerConfig(true, "dummy.remote.storage.class",
+                "dummy.remote.storage.class.path",
+                "dummy.remote.log.metadata.class", "dummy.remote.log.metadata.class.path",
+                "listener.name",
+                1024 * 1024L,
+                1,
+                2, // Change here
+                2, // Change here
+                60000L,
+                100L,
+                60000L,
+                0.3,
+                10,
+                100,
+                100,
+                rsmPrefix,
+                rsmProps,
+                rlmmPrefix,
+                rlmmProps,
+                Long.MAX_VALUE,
+                11,
+                1,
+                Long.MAX_VALUE,
+                11,
+                1);
+        
+        assertNotEquals(config1.hashCode(), config3.hashCode());
+        assertNotEquals(config1, config3);
+    }
 }