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

jinrongtong pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/rocketmq.git


The following commit(s) were added to refs/heads/develop by this push:
     new bdc7c0ab6c [ISSUE #6873] If dns resolve controller address exception 
will update controllerAddresses to null (#8180)
bdc7c0ab6c is described below

commit bdc7c0ab6cb296c736c2f322b840c6da9613d10e
Author: weihubeats <we...@apache.org>
AuthorDate: Fri May 24 10:24:31 2024 +0800

    [ISSUE #6873] If dns resolve controller address exception will update 
controllerAddresses to null (#8180)
    
    * Adding null does not update
    
    * rolling back
    
    * dns resolution failure not updating controllerAddresses
---
 .../broker/controller/ReplicasManager.java         |  7 +++--
 .../broker/controller/ReplicasManagerTest.java     | 36 +++++++++++++++++++---
 2 files changed, 36 insertions(+), 7 deletions(-)

diff --git 
a/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java
 
b/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java
index a1d711cb27..c294f860ba 100644
--- 
a/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java
+++ 
b/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java
@@ -30,7 +30,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
-
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.broker.out.BrokerOuterAPI;
@@ -803,7 +803,10 @@ public class ReplicasManager {
 
     private void updateControllerAddr() {
         if (brokerConfig.isFetchControllerAddrByDnsLookup()) {
-            this.controllerAddresses = 
brokerOuterAPI.dnsLookupAddressByDomain(this.brokerConfig.getControllerAddr());
+            List<String> adders = 
brokerOuterAPI.dnsLookupAddressByDomain(this.brokerConfig.getControllerAddr());
+            if (CollectionUtils.isNotEmpty(adders)) {
+                this.controllerAddresses = adders;
+            }
         } else {
             final String controllerPaths = 
this.brokerConfig.getControllerAddr();
             final String[] controllers = controllerPaths.split(";");
diff --git 
a/broker/src/test/java/org/apache/rocketmq/broker/controller/ReplicasManagerTest.java
 
b/broker/src/test/java/org/apache/rocketmq/broker/controller/ReplicasManagerTest.java
index c863f7ac96..9f17f2bd59 100644
--- 
a/broker/src/test/java/org/apache/rocketmq/broker/controller/ReplicasManagerTest.java
+++ 
b/broker/src/test/java/org/apache/rocketmq/broker/controller/ReplicasManagerTest.java
@@ -17,12 +17,15 @@
 
 package org.apache.rocketmq.broker.controller;
 
+import com.google.common.collect.Lists;
 import java.io.File;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
-
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.broker.out.BrokerOuterAPI;
 import org.apache.rocketmq.broker.slave.SlaveSynchronize;
@@ -31,11 +34,11 @@ import org.apache.rocketmq.common.BrokerConfig;
 import org.apache.rocketmq.common.Pair;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.remoting.protocol.body.SyncStateSet;
+import 
org.apache.rocketmq.remoting.protocol.header.controller.ElectMasterResponseHeader;
 import 
org.apache.rocketmq.remoting.protocol.header.controller.GetMetaDataResponseHeader;
 import 
org.apache.rocketmq.remoting.protocol.header.controller.GetReplicaInfoResponseHeader;
 import 
org.apache.rocketmq.remoting.protocol.header.controller.register.ApplyBrokerIdResponseHeader;
 import 
org.apache.rocketmq.remoting.protocol.header.controller.register.GetNextBrokerIdResponseHeader;
-import 
org.apache.rocketmq.remoting.protocol.header.controller.ElectMasterResponseHeader;
 import 
org.apache.rocketmq.remoting.protocol.header.controller.register.RegisterBrokerToControllerResponseHeader;
 import org.apache.rocketmq.store.DefaultMessageStore;
 import org.apache.rocketmq.store.RunningFlags;
@@ -52,6 +55,7 @@ import org.mockito.junit.MockitoJUnitRunner;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
@@ -189,11 +193,11 @@ public class ReplicasManagerTest {
         syncStateSetA.add(BROKER_ID_2);
         // not equal to localAddress
         Assertions.assertThatCode(() -> 
replicasManager.changeBrokerRole(BROKER_ID_2, NEW_MASTER_ADDRESS, 
NEW_MASTER_EPOCH, OLD_MASTER_EPOCH, syncStateSetB))
-                .doesNotThrowAnyException();
+            .doesNotThrowAnyException();
 
         // equal to localAddress
         Assertions.assertThatCode(() -> 
replicasManager.changeBrokerRole(BROKER_ID_1, OLD_MASTER_ADDRESS, 
NEW_MASTER_EPOCH, OLD_MASTER_EPOCH, syncStateSetA))
-                .doesNotThrowAnyException();
+            .doesNotThrowAnyException();
     }
 
     @Test
@@ -206,6 +210,28 @@ public class ReplicasManagerTest {
     @Test
     public void changeToSlaveTest() {
         Assertions.assertThatCode(() -> 
replicasManager.changeToSlave(NEW_MASTER_ADDRESS, NEW_MASTER_EPOCH, 
BROKER_ID_2))
-                .doesNotThrowAnyException();
+            .doesNotThrowAnyException();
     }
+
+    @Test
+    public void testUpdateControllerAddr() throws Exception {
+        final String controllerAddr = "192.168.1.1";
+        brokerConfig.setFetchControllerAddrByDnsLookup(true);
+        
when(brokerOuterAPI.dnsLookupAddressByDomain(anyString())).thenReturn(Lists.newArrayList(controllerAddr));
+        Method method = 
ReplicasManager.class.getDeclaredMethod("updateControllerAddr");
+        method.setAccessible(true);
+        method.invoke(replicasManager);
+
+        List<String> addresses = replicasManager.getControllerAddresses();
+        Assertions.assertThat(addresses).contains(controllerAddr);
+
+        // Simulating dns resolution exceptions
+        
when(brokerOuterAPI.dnsLookupAddressByDomain(anyString())).thenReturn(new 
ArrayList<>());
+
+        method.invoke(replicasManager);
+        addresses = replicasManager.getControllerAddresses();
+        Assertions.assertThat(addresses).contains(controllerAddr);
+
+    }
+
 }

Reply via email to