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