This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.1 by this push:
new 234f1c64ab Fix lock acquire blocked
234f1c64ab is described below
commit 234f1c64abb34cfc49bf233cbf37a4f6e2953857
Author: Albumen Kevin <[email protected]>
AuthorDate: Sun Mar 12 10:26:18 2023 +0800
Fix lock acquire blocked
---
.../java/org/apache/dubbo/rpc/model/ApplicationModel.java | 6 ++++++
.../main/java/org/apache/dubbo/rpc/model/FrameworkModel.java | 12 +++++++++++-
.../main/java/org/apache/dubbo/rpc/model/ModuleModel.java | 6 ++++++
.../src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java | 9 ++++++++-
4 files changed, 31 insertions(+), 2 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
index 31c11f6aca..50b94b956e 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@ -36,6 +36,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.Lock;
/**
* {@link ExtensionLoader}, {@code DubboBootstrap} and this class are at
present designed to be
@@ -345,6 +346,11 @@ public class ApplicationModel extends ScopeModel {
this.deployer = deployer;
}
+ @Override
+ protected Lock acquireDestroyLock() {
+ return frameworkModel.acquireDestroyLock();
+ }
+
// =============================== Deprecated Methods Start
=======================================
/**
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
index 8c2787eadc..2bdfa9f577 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
@@ -33,6 +33,8 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
/**
@@ -48,7 +50,7 @@ public class FrameworkModel extends ScopeModel {
private static final AtomicLong index = new AtomicLong(1);
private static final Object globalLock = new Object();
-
+
private volatile static FrameworkModel defaultInstance;
private static final List<FrameworkModel> allInstances = new
CopyOnWriteArrayList<>();
@@ -68,6 +70,8 @@ public class FrameworkModel extends ScopeModel {
private final ApplicationModel internalApplicationModel;
+ private final ReentrantLock destroyLock = new ReentrantLock();
+
/**
* Use {@link FrameworkModel#newModel()} to create a new model
*/
@@ -356,6 +360,12 @@ public class FrameworkModel extends ScopeModel {
return serviceRepository;
}
+
+ @Override
+ protected Lock acquireDestroyLock() {
+ return destroyLock;
+ }
+
@Override
public Environment getModelEnvironment() {
throw new UnsupportedOperationException("Environment is inaccessible
for FrameworkModel");
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
index c06e3d075d..2178d0b3a9 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.config.context.ModuleConfigManager;
import java.util.HashMap;
import java.util.Set;
+import java.util.concurrent.locks.Lock;
/**
* Model of a service module
@@ -172,6 +173,11 @@ public class ModuleModel extends ScopeModel {
this.deployer = deployer;
}
+ @Override
+ protected Lock acquireDestroyLock() {
+ return getApplicationModel().getFrameworkModel().acquireDestroyLock();
+ }
+
/**
* for ut only
*/
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
index e066952528..bbf1bcc987 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
@@ -34,6 +34,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.locks.Lock;
import static
org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_UNABLE_DESTROY_MODEL;
@@ -109,8 +110,12 @@ public abstract class ScopeModel implements
ExtensionAccessor {
}
}
+ protected abstract Lock acquireDestroyLock();
+
public void destroy() {
- synchronized (instLock) {
+ Lock lock = acquireDestroyLock();
+ try {
+ lock.lock();
if (destroyed.compareAndSet(false, true)) {
try {
onDestroy();
@@ -128,6 +133,8 @@ public abstract class ScopeModel implements
ExtensionAccessor {
LOGGER.error(CONFIG_UNABLE_DESTROY_MODEL, "", "", "Error
happened when destroying ScopeModel.", t);
}
}
+ } finally {
+ lock.unlock();
}
}