You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2018/10/30 09:17:42 UTC

[incubator-skywalking] 01/01: Avoid service inventory object concurrency situation.

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

wusheng pushed a commit to branch fix-concurrency
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git

commit e63b5ab7b82734cef1d3e3c43dbaf0bcfe2d687f
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Oct 30 17:17:30 2018 +0800

    Avoid service inventory object concurrency situation.
---
 .../oap/server/core/register/ServiceInventory.java        | 15 +++++++++++++++
 .../core/register/service/ServiceInventoryRegister.java   |  1 +
 2 files changed, 16 insertions(+)

diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java
index c2c2199..7699918 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java
@@ -76,6 +76,21 @@ public class ServiceInventory extends RegisterSource {
         return result;
     }
 
+    @Override
+    public ServiceInventory clone() {
+        ServiceInventory inventory = new ServiceInventory();
+        inventory.setSequence(getSequence());
+        inventory.setRegisterTime(getRegisterTime());
+        inventory.setHeartbeatTime(getHeartbeatTime());
+        inventory.setName(name);
+        inventory.setIsAddress(isAddress);
+        inventory.setAddressId(addressId);
+        inventory.setMappingLastUpdateTime(mappingLastUpdateTime);
+        inventory.setMappingServiceId(mappingServiceId);
+
+        return inventory;
+    }
+
     @Override public boolean equals(Object obj) {
         if (this == obj)
             return true;
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 531d3f1..8bc2ac3 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
@@ -103,6 +103,7 @@ public class ServiceInventoryRegister implements IServiceInventoryRegister {
     @Override public void updateMapping(int serviceId, int mappingServiceId) {
         ServiceInventory serviceInventory = getServiceInventoryCache().get(serviceId);
         if (Objects.nonNull(serviceInventory)) {
+            serviceInventory = serviceInventory.clone();
             serviceInventory.setMappingServiceId(mappingServiceId);
             serviceInventory.setMappingLastUpdateTime(System.currentTimeMillis());