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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0f5626ce80 fix: check duplicates before remapping handler ids in 
discovery upstream import (#6532)
0f5626ce80 is described below

commit 0f5626ce80d0c8243d79ed7c556b5826bfdcaccc
Author: hengyuss <[email protected]>
AuthorDate: Tue Sep 15 18:46:16 2026 +0800

    fix: check duplicates before remapping handler ids in discovery upstream 
import (#6532)
    
    * fix: 
shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
    
    * fix: add tests
    
    * fix: add test
    
    ---------
    
    Co-authored-by: aias00 <[email protected]>
    Co-authored-by: Liming Deng <[email protected]>
---
 .../service/impl/DiscoveryUpstreamServiceImpl.java |  5 ++-
 .../service/DiscoveryUpstreamServiceTest.java      | 47 ++++++++++++++++++++++
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
index b626f314fa..20cf8f8ff0 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
@@ -290,6 +290,7 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
     }
     
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public ConfigImportResult importData(final String namespace, final 
List<DiscoveryUpstreamDTO> discoveryUpstreamList, final ConfigsImportContext 
context) {
         if (CollectionUtils.isEmpty(discoveryUpstreamList)) {
             return ConfigImportResult.success();
@@ -305,7 +306,7 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
             String discoveryHandlerId = 
discoveryUpstreamDTO.getDiscoveryHandlerId();
             String url = discoveryUpstreamDTO.getUrl();
             Set<String> existsUpstreamUrlSet = discoveryHandlerUpstreamMap
-                    .getOrDefault(discoveryHandlerId, Lists.newArrayList())
+                    
.getOrDefault(discoveryHandlerIdMapping.getOrDefault(discoveryHandlerId, 
discoveryHandlerId), Lists.newArrayList())
                     .stream()
                     .map(DiscoveryUpstreamDO::getUpstreamUrl)
                     .collect(Collectors.toSet());
@@ -317,7 +318,7 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
             }
             discoveryUpstreamDTO.setNamespaceId(namespace);
             discoveryUpstreamDTO.setId(null);
-            
discoveryUpstreamDTO.setDiscoveryHandlerId(discoveryHandlerIdMapping.get(discoveryUpstreamDTO.getDiscoveryHandlerId()));
+            
discoveryUpstreamDTO.setDiscoveryHandlerId(discoveryHandlerIdMapping.getOrDefault(discoveryUpstreamDTO.getDiscoveryHandlerId(),
 discoveryUpstreamDTO.getDiscoveryHandlerId()));
             DiscoveryUpstreamDO discoveryUpstreamDO = 
DiscoveryUpstreamDO.buildDiscoveryUpstreamDO(discoveryUpstreamDTO);
             discoveryUpstreamMapper.insert(discoveryUpstreamDO);
             successCount++;
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
index 28adf2c609..7e187e1963 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
@@ -36,6 +36,7 @@ import org.apache.shenyu.admin.model.entity.ProxySelectorDO;
 import org.apache.shenyu.admin.model.entity.SelectorDO;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.DiscoveryUpstreamVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.service.impl.DiscoveryUpstreamServiceImpl;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.dto.DiscoverySyncData;
@@ -172,6 +173,52 @@ public final class DiscoveryUpstreamServiceTest {
 
     }
 
+    @Test
+    public void testImportDataWithNamespaceAndContext() {
+        String namespace = "ns1";
+        String oldHandlerId = "old_handler_id";
+        String newHandlerId = "new_handler_id";
+
+        ConfigsImportContext context = new ConfigsImportContext();
+        context.getDiscoveryHandlerIdMapping().put(oldHandlerId, newHandlerId);
+
+        List<DiscoveryUpstreamDO> existingList = 
Collections.singletonList(buildDiscoveryUpstreamDO("", newHandlerId, "url1"));
+        
when(discoveryUpstreamMapper.selectByNamespaceId(namespace)).thenReturn(existingList);
+        given(this.discoveryUpstreamMapper.insert(any())).willReturn(1);
+
+        final List<DiscoveryUpstreamDTO> upstreamDTOList = 
Collections.singletonList(buildDiscoveryUpstreamDTO("", oldHandlerId, "url2"));
+        ConfigImportResult successResult = 
this.discoveryUpstreamService.importData(namespace, upstreamDTOList, context);
+        assertNotNull(successResult);
+        Assertions.assertEquals(1, successResult.getSuccessCount());
+
+        final List<DiscoveryUpstreamDTO> duplicateDTOList = 
Collections.singletonList(buildDiscoveryUpstreamDTO("", oldHandlerId, "url1"));
+        ConfigImportResult duplicateResult = 
this.discoveryUpstreamService.importData(namespace, duplicateDTOList, context);
+        assertNotNull(duplicateResult);
+        Assertions.assertEquals(0, duplicateResult.getSuccessCount());
+    }
+
+    @Test
+    public void testImportDataWithNamespaceUnmappedHandlerId() {
+        String namespace = "ns1";
+        String unmappedHandlerId = "unmapped_handler_id";
+
+        ConfigsImportContext context = new ConfigsImportContext();
+
+        List<DiscoveryUpstreamDO> existingList = 
Collections.singletonList(buildDiscoveryUpstreamDO("", unmappedHandlerId, 
"url1"));
+        
when(discoveryUpstreamMapper.selectByNamespaceId(namespace)).thenReturn(existingList);
+        given(this.discoveryUpstreamMapper.insert(any())).willReturn(1);
+
+        final List<DiscoveryUpstreamDTO> upstreamDTOList = 
Collections.singletonList(buildDiscoveryUpstreamDTO("", unmappedHandlerId, 
"url2"));
+        ConfigImportResult successResult = 
this.discoveryUpstreamService.importData(namespace, upstreamDTOList, context);
+        assertNotNull(successResult);
+        Assertions.assertEquals(1, successResult.getSuccessCount());
+
+        final List<DiscoveryUpstreamDTO> duplicateDTOList = 
Collections.singletonList(buildDiscoveryUpstreamDTO("", unmappedHandlerId, 
"url1"));
+        ConfigImportResult duplicateResult = 
this.discoveryUpstreamService.importData(namespace, duplicateDTOList, context);
+        assertNotNull(duplicateResult);
+        Assertions.assertEquals(0, duplicateResult.getSuccessCount());
+    }
+
     @Test
     public void testUpdateBatch() {
         when(discoveryUpstreamMapper.insert(any())).thenReturn(1);

Reply via email to