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);