diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java index 8b276b23b..e560fed71 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java @@ -139,11 +139,13 @@ public class ServiceInventoryRegister implements IServiceInventoryRegister { @Override public void resetMapping(int serviceId) { ServiceInventory serviceInventory = getServiceInventoryCache().get(serviceId); if (Objects.nonNull(serviceInventory)) { - serviceInventory = serviceInventory.getClone(); - serviceInventory.setLastUpdateTime(System.currentTimeMillis()); - serviceInventory.setResetServiceMapping(true); + if (serviceInventory.getMappingServiceId() != Const.NONE) { + serviceInventory = serviceInventory.getClone(); + serviceInventory.setLastUpdateTime(System.currentTimeMillis()); + serviceInventory.setResetServiceMapping(true); - InventoryStreamProcessor.getInstance().in(serviceInventory); + InventoryStreamProcessor.getInstance().in(serviceInventory); + } } else { logger.warn("Service {} mapping update, but not found in storage.", serviceId); } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java index 7010b8815..0604754bd 100755 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java @@ -21,9 +21,11 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener import lombok.Getter; import lombok.Setter; import org.apache.skywalking.apm.network.language.agent.SpanLayer; +import org.apache.skywalking.oap.server.core.Const; import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.cache.NetworkAddressInventoryCache; import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache; +import org.apache.skywalking.oap.server.core.register.ServiceInventory; import org.apache.skywalking.oap.server.core.register.service.IServiceInventoryRegister; import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModuleConfig; @@ -35,7 +37,7 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener. import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; /** @@ -49,8 +51,8 @@ public class ServiceMappingSpanListener implements EntrySpanListener { private final TraceServiceModuleConfig config; private final ServiceInventoryCache serviceInventoryCache; private final NetworkAddressInventoryCache networkAddressInventoryCache; - private final List serviceMappings = new LinkedList<>(); - private final List servicesToResetMapping = new LinkedList<>(); + private final List serviceMappings = new ArrayList<>(); + private final List servicesToResetMapping = new ArrayList<>(); private ServiceMappingSpanListener(ModuleManager moduleManager, TraceServiceModuleConfig config) { this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class); @@ -79,7 +81,10 @@ public class ServiceMappingSpanListener implements EntrySpanListener { if (logger.isDebugEnabled()) { logger.debug("{} is configured as gateway, will reset its mapping service id", serviceId); } - servicesToResetMapping.add(serviceId); + ServiceInventory serviceInventory = serviceInventoryCache.get(serviceId); + if (serviceInventory.getMappingServiceId() != Const.NONE && !servicesToResetMapping.contains(serviceId)) { + servicesToResetMapping.add(serviceId); + } } else { ServiceMapping serviceMapping = new ServiceMapping(); serviceMapping.setServiceId(serviceId);