diff --git a/fe/fe-core/src/main/java/org/apache/doris/cloud/system/CloudSystemInfoService.java b/fe/fe-core/src/main/java/org/apache/doris/cloud/system/CloudSystemInfoService.java index 34865f06e61432..52f58bde0917be 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/cloud/system/CloudSystemInfoService.java +++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/system/CloudSystemInfoService.java @@ -603,8 +603,6 @@ public void addBackends(List hostInfos, Map tagMap) th String instanceId = Config.cluster_id == -1 ? ((CloudEnv) Env.getCurrentEnv()).getCloudInstanceId() : String.valueOf(Config.cluster_id); - String cloudUniqueId = "1:" + instanceId + ":" + RandomIdentifierGenerator.generateRandomIdentifier(8); - String publicEndpoint = tagMap.getOrDefault(Tag.PUBLIC_ENDPOINT, ""); String privateEndpoint = tagMap.getOrDefault(Tag.PRIVATE_ENDPOINT, ""); @@ -614,6 +612,7 @@ public void addBackends(List hostInfos, Map tagMap) th .build(); for (HostInfo hostInfo : hostInfos) { + String cloudUniqueId = "1:" + instanceId + ":" + RandomIdentifierGenerator.generateRandomIdentifier(8); Cloud.NodeInfoPB nodeInfoPB = Cloud.NodeInfoPB.newBuilder() .setCloudUniqueId(cloudUniqueId) .setIp(hostInfo.getHost()) diff --git a/fe/fe-core/src/test/java/org/apache/doris/cloud/system/CloudSystemInfoServiceTest.java b/fe/fe-core/src/test/java/org/apache/doris/cloud/system/CloudSystemInfoServiceTest.java index 85bd4677a0c4c6..0aafe6bd996f76 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/cloud/system/CloudSystemInfoServiceTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/cloud/system/CloudSystemInfoServiceTest.java @@ -19,19 +19,28 @@ import org.apache.doris.analysis.UserIdentity; import org.apache.doris.catalog.Env; +import org.apache.doris.cloud.catalog.CloudEnv; import org.apache.doris.cloud.catalog.ComputeGroup; +import org.apache.doris.cloud.proto.Cloud; +import org.apache.doris.cloud.rpc.MetaServiceProxy; import org.apache.doris.common.Config; import org.apache.doris.qe.ConnectContext; import org.apache.doris.resource.Tag; import org.apache.doris.system.Backend; +import org.apache.doris.system.SystemInfoService.HostInfo; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; public class CloudSystemInfoServiceTest { private CloudSystemInfoService infoService; @@ -40,6 +49,7 @@ public class CloudSystemInfoServiceTest { public void setUp() { // Enable cloud mode for testing Config.cloud_unique_id = "test_cloud_unique_id"; + Config.meta_service_endpoint = "127.0.0.1:5000"; } @Test @@ -973,6 +983,52 @@ public void testGetMinPipelineExecutorSizeWithConnectContext() { } } + @Test + public void testAddBackendsGenerateUniqueCloudUniqueIdPerBackend() throws Exception { + infoService = new CloudSystemInfoService(); + + CloudEnv cloudEnv = Mockito.mock(CloudEnv.class); + MetaServiceProxy metaServiceProxy = Mockito.mock(MetaServiceProxy.class); + AtomicReference addNodeRequestRef = new AtomicReference<>(); + + Mockito.when(cloudEnv.getCloudInstanceId()).thenReturn("instance-test"); + + try (MockedStatic mockedEnv = Mockito.mockStatic(Env.class); + MockedStatic mockedMetaServiceProxy = Mockito.mockStatic(MetaServiceProxy.class)) { + mockedEnv.when(Env::getCurrentEnv).thenReturn(cloudEnv); + mockedMetaServiceProxy.when(MetaServiceProxy::getInstance).thenReturn(metaServiceProxy); + + Mockito.when(metaServiceProxy.alterCluster(Mockito.any())).thenAnswer(invocation -> { + Cloud.AlterClusterRequest request = invocation.getArgument(0); + if (request.getOp() == Cloud.AlterClusterRequest.Operation.ADD_NODE) { + addNodeRequestRef.set(request); + } + return Cloud.AlterClusterResponse.newBuilder() + .setStatus(Cloud.MetaServiceResponseStatus.newBuilder() + .setCode(Cloud.MetaServiceCode.OK) + .setMsg("OK")) + .build(); + }); + + Map tagMap = Tag.DEFAULT_BACKEND_TAG.toMap(); + tagMap.put(Tag.COMPUTE_GROUP_NAME, "test_compute_group"); + + List hostInfos = new ArrayList<>(); + hostInfos.add(new HostInfo("192.168.1.189", 9050)); + hostInfos.add(new HostInfo("192.168.1.189", 9052)); + + infoService.addBackends(hostInfos, tagMap); + } + + Cloud.AlterClusterRequest addNodeRequest = addNodeRequestRef.get(); + Assert.assertNotNull(addNodeRequest); + Assert.assertEquals(2, addNodeRequest.getCluster().getNodesCount()); + + Set cloudUniqueIds = new HashSet<>(); + addNodeRequest.getCluster().getNodesList().forEach(node -> cloudUniqueIds.add(node.getCloudUniqueId())); + Assert.assertEquals(2, cloudUniqueIds.size()); + } + /** * Helper method to create a test ConnectContext with specific cluster name */