You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2021/03/26 02:43:04 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2242] fix org.apache.servicecomb.core.definition.MicroserviceVersionsMeta#MicroserviceVersionsMeta bug of OOM (#2320)

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 00bc846  [SCB-2242] fix org.apache.servicecomb.core.definition.MicroserviceVersionsMeta#MicroserviceVersionsMeta bug of OOM (#2320)
00bc846 is described below

commit 00bc846ac1e31ae81a2dd57fde0ec7348ed7426d
Author: wujimin <wu...@huawei.com>
AuthorDate: Fri Mar 26 10:42:51 2021 +0800

    [SCB-2242] fix org.apache.servicecomb.core.definition.MicroserviceVersionsMeta#MicroserviceVersionsMeta bug of OOM (#2320)
---
 .../org/apache/servicecomb/core/BootListener.java  | 14 +++++++++++--
 .../core/definition/MicroserviceVersionsMeta.java  | 24 ++++++++++++++++------
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/BootListener.java b/core/src/main/java/org/apache/servicecomb/core/BootListener.java
index cb740a2..174f24f 100644
--- a/core/src/main/java/org/apache/servicecomb/core/BootListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/BootListener.java
@@ -40,20 +40,30 @@ public interface BootListener {
 
     private EventType eventType;
 
+    public BootEvent() {
+    }
+
+    public BootEvent(SCBEngine scbEngine, EventType eventType) {
+      this.scbEngine = scbEngine;
+      this.eventType = eventType;
+    }
+
     public SCBEngine getScbEngine() {
       return scbEngine;
     }
 
-    public void setScbEngine(SCBEngine scbEngine) {
+    public BootEvent setScbEngine(SCBEngine scbEngine) {
       this.scbEngine = scbEngine;
+      return this;
     }
 
     public EventType getEventType() {
       return eventType;
     }
 
-    public void setEventType(EventType eventType) {
+    public BootEvent setEventType(EventType eventType) {
       this.eventType = eventType;
+      return this;
     }
   }
 
diff --git a/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceVersionsMeta.java b/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceVersionsMeta.java
index 8252d2f..05f3362 100644
--- a/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceVersionsMeta.java
+++ b/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceVersionsMeta.java
@@ -22,21 +22,33 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 
 public class MicroserviceVersionsMeta {
-  protected SCBEngine scbEngine;
+  protected final SCBEngine scbEngine;
 
-  protected MicroserviceConfig microserviceConfig;
+  protected final String microserviceName;
 
   // key is operationMeta.getMicroserviceQualifiedName()
-  private Map<String, OperationConfig> configs = new ConcurrentHashMapEx<>();
+  private final Map<String, OperationConfig> configs = new ConcurrentHashMapEx<>();
+
+  protected volatile MicroserviceConfig microserviceConfig;
 
   public MicroserviceVersionsMeta(SCBEngine scbEngine, String microserviceName) {
     this.scbEngine = scbEngine;
-    this.microserviceConfig = scbEngine.getPriorityPropertyManager()
-        .createConfigObject(MicroserviceConfig.class, "service", microserviceName);
+    this.microserviceName = microserviceName;
   }
 
-
+  // should not create in constructor
+  // when invoke not exist microservice, will create DynamicProperty(com.netflix.config.DynamicProperty.getInstance)
+  // edge scene, if attacker request to forward request to not exist microservice, will cause OOM
   public MicroserviceConfig getMicroserviceConfig() {
+    if (microserviceConfig == null) {
+      synchronized (this) {
+        if (microserviceConfig == null) {
+          this.microserviceConfig = scbEngine.getPriorityPropertyManager()
+              .createConfigObject(MicroserviceConfig.class, "service", microserviceName);
+        }
+      }
+    }
+
     return microserviceConfig;
   }