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

gongchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/master by this push:
     new 625dbe9624 [bugfix] redis cluster monitor master-slave relationship is 
inconsistent (#3874)
625dbe9624 is described below

commit 625dbe96248770a076366a89527f1377da9f4741
Author: P_Peaceful <[email protected]>
AuthorDate: Sun Nov 30 19:39:40 2025 +0800

    [bugfix] redis cluster monitor master-slave relationship is inconsistent 
(#3874)
    
    Co-authored-by: Tomsun28 <[email protected]>
---
 .../collect/redis/RedisCommonCollectImpl.java      | 21 +++++++----
 .../collect/redis/RedisClusterCollectImplTest.java | 42 +++++++++++++++-------
 2 files changed, 45 insertions(+), 18 deletions(-)

diff --git 
a/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/redis/RedisCommonCollectImpl.java
 
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/redis/RedisCommonCollectImpl.java
index 90b258545d..ac520cf72b 100644
--- 
a/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/redis/RedisCommonCollectImpl.java
+++ 
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/redis/RedisCommonCollectImpl.java
@@ -67,6 +67,8 @@ public class RedisCommonCollectImpl extends AbstractCollect {
 
     private static final String CLUSTER = "3";
 
+    private static final String SINGLE = "1";
+
     private static final String CLUSTER_INFO = "cluster";
 
     private static final String UNIQUE_IDENTITY = "identity";
@@ -140,7 +142,7 @@ public class RedisCommonCollectImpl extends AbstractCollect 
{
      * @return data
      */
     private List<Map<String, String>> getClusterRedisInfo(Metrics metrics) 
throws GeneralSecurityException, IOException {
-        Map<String, StatefulRedisClusterConnection<String, String>> 
connectionMap = getConnectionList(metrics.getRedis());
+        Map<String, StatefulRedisConnection<String, String>> connectionMap = 
getConnectionList(metrics.getRedis());
         List<Map<String, String>> list = new ArrayList<>(connectionMap.size());
         connectionMap.forEach((identity, connection) ->{
             String info = connection.sync().info(metrics.getName());
@@ -214,16 +216,23 @@ public class RedisCommonCollectImpl extends 
AbstractCollect {
      * @param redisProtocol protocol
      * @return connection map
      */
-    private Map<String, StatefulRedisClusterConnection<String, String>> 
getConnectionList(RedisProtocol redisProtocol) throws GeneralSecurityException, 
IOException {
+    private Map<String, StatefulRedisConnection<String, String>> 
getConnectionList(RedisProtocol redisProtocol) throws GeneralSecurityException, 
IOException {
         // first connection
         StatefulRedisClusterConnection<String, String> connection = 
getClusterConnection(redisProtocol);
         Partitions partitions = connection.getPartitions();
-        Map<String, StatefulRedisClusterConnection<String, String>> 
clusterConnectionMap = new HashMap<>(partitions.size());
+        Map<String, StatefulRedisConnection<String, String>> 
clusterConnectionMap = new HashMap<>(partitions.size());
         for (RedisClusterNode partition : partitions) {
             RedisURI uri = partition.getUri();
-            redisProtocol.setHost(uri.getHost());
-            redisProtocol.setPort(String.valueOf(uri.getPort()));
-            StatefulRedisClusterConnection<String, String> clusterConnection = 
getClusterConnection(redisProtocol);
+            RedisProtocol singleRedisProtocol = RedisProtocol.builder()
+                    .host(uri.getHost())
+                    .port(String.valueOf(uri.getPort()))
+                    .username(redisProtocol.getUsername())
+                    .password(redisProtocol.getPassword())
+                    .pattern(SINGLE)
+                    .timeout(redisProtocol.getTimeout())
+                    .sshTunnel(redisProtocol.getSshTunnel())
+                    .build();
+            StatefulRedisConnection<String, String> clusterConnection = 
getSingleConnection(singleRedisProtocol);
             clusterConnectionMap.put(doUri(uri.getHost(), uri.getPort()), 
clusterConnection);
         }
         return clusterConnectionMap;
diff --git 
a/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/redis/RedisClusterCollectImplTest.java
 
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/redis/RedisClusterCollectImplTest.java
index 96aa4db48f..5d74e92f2b 100644
--- 
a/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/redis/RedisClusterCollectImplTest.java
+++ 
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/redis/RedisClusterCollectImplTest.java
@@ -19,10 +19,13 @@ package org.apache.hertzbeat.collector.collect.redis;
 
 import static 
org.apache.hertzbeat.common.constants.CommonConstants.TYPE_STRING;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import io.lettuce.core.RedisClient;
 import io.lettuce.core.RedisURI;
+import io.lettuce.core.api.StatefulRedisConnection;
+import io.lettuce.core.api.sync.RedisCommands;
 import io.lettuce.core.cluster.RedisClusterClient;
 import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
-import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands;
 import io.lettuce.core.cluster.models.partitions.Partitions;
 import io.lettuce.core.cluster.models.partitions.RedisClusterNode;
 import io.lettuce.core.resource.ClientResources;
@@ -37,6 +40,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
 
@@ -51,13 +55,19 @@ public class RedisClusterCollectImplTest {
 
 
     @Mock
-    private StatefulRedisClusterConnection<String, String> connection;
+    private StatefulRedisClusterConnection<String, String> clusterConnection;
+
+    @Mock
+    private StatefulRedisConnection<String, String> singleConnection;
+
+    @Mock
+    private RedisCommands<String, String> cmd;
 
     @Mock
-    private RedisAdvancedClusterCommands<String, String> cmd;
+    private RedisClusterClient clusterClient;
 
     @Mock
-    private RedisClusterClient client;
+    private RedisClient singleClient;
 
     @BeforeEach
     void setUp() {
@@ -65,8 +75,10 @@ public class RedisClusterCollectImplTest {
 
     @AfterEach
     void setDown() {
-        connection.close();
-        client.shutdown();
+        clusterConnection.close();
+        singleConnection.close();
+        clusterClient.shutdown();
+        singleClient.shutdown();
     }
 
     @Test
@@ -110,10 +122,14 @@ public class RedisClusterCollectImplTest {
         metrics.setAliasFields(aliasField);
         metrics.setFields(fields);
 
-
-        Mockito.mockStatic(RedisClusterClient.class).when(() -> 
RedisClusterClient.create(Mockito.any(ClientResources.class),
-                Mockito.any(RedisURI.class))).thenReturn(client);
-        Mockito.when(client.connect()).thenReturn(connection);
+        MockedStatic<RedisClusterClient> redisClusterClientMockedStatic = 
Mockito.mockStatic(RedisClusterClient.class);
+        redisClusterClientMockedStatic.when(() -> 
RedisClusterClient.create(Mockito.any(ClientResources.class),
+                Mockito.any(RedisURI.class))).thenReturn(clusterClient);
+        Mockito.when(clusterClient.connect()).thenReturn(clusterConnection);
+        MockedStatic<RedisClient> redisClientMockedStatic = 
Mockito.mockStatic(RedisClient.class);
+        redisClientMockedStatic.when(() -> 
RedisClient.create(Mockito.any(ClientResources.class),
+                Mockito.any(RedisURI.class))).thenReturn(singleClient);
+        Mockito.when(singleClient.connect()).thenReturn(singleConnection);
 
         Partitions partitions = new Partitions();
         RedisClusterNode node = new RedisClusterNode();
@@ -125,9 +141,9 @@ public class RedisClusterCollectImplTest {
         node2.setUri(RedisURI.create("redis://" + uri2));
         partitions.add(node2);
 
-        Mockito.when(connection.getPartitions()).thenReturn(partitions);
+        Mockito.when(clusterConnection.getPartitions()).thenReturn(partitions);
 
-        Mockito.when(connection.sync()).thenReturn(cmd);
+        Mockito.when(singleConnection.sync()).thenReturn(cmd);
         Mockito.when(cmd.info(metrics.getName())).thenReturn(info);
         Mockito.when(cmd.clusterInfo()).thenReturn(clusterInfo);
 
@@ -147,6 +163,8 @@ public class RedisClusterCollectImplTest {
                 assertEquals(row.getColumns(2), uri2);
             }
         }
+        redisClusterClientMockedStatic.close();
+        redisClientMockedStatic.close();
 
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to