You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/08/10 11:37:58 UTC
[dubbo] branch 3.0 updated: perf: Avoid that resources are not
released during calling destroy (#8459)
This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 8bc6144 perf: Avoid that resources are not released during calling destroy (#8459)
8bc6144 is described below
commit 8bc6144938fdecd69893574d8d428e0c6e159cdd
Author: Xiong, Pin <pi...@foxmail.com>
AuthorDate: Tue Aug 10 06:37:48 2021 -0500
perf: Avoid that resources are not released during calling destroy (#8459)
1. Catch and ignore all exception when destroying
2. Update the log level in testcases
3. Don't upadte service instance regularly when failed to register
---
.../manager/DefaultExecutorRepository.java | 35 +++++++--
.../dubbo/config/bootstrap/DubboBootstrap.java | 91 ++++++++++++++--------
.../reference/DubboConfigBeanInitializerTest.java | 11 ++-
.../spring/reference/localcall/LocalCallTest2.java | 7 ++
.../src/test/resources/log4j.xml | 2 +-
.../support/AbstractMetadataReportFactory.java | 11 ++-
.../registry/support/AbstractRegistryFactory.java | 2 +-
7 files changed, 116 insertions(+), 43 deletions(-)
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java
index fff55da..ae437ee 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/DefaultExecutorRepository.java
@@ -215,7 +215,12 @@ public class DefaultExecutorRepository implements ExecutorRepository {
public void shutdownServiceExportExecutor() {
synchronized (LOCK) {
if (serviceExportExecutor != null && !serviceExportExecutor.isShutdown()) {
- serviceExportExecutor.shutdown();
+ try{
+ serviceExportExecutor.shutdown();
+ }catch (Throwable ignored){
+ // ignored
+ logger.warn(ignored.getMessage(),ignored);
+ }
}
serviceExportExecutor = null;
@@ -258,7 +263,11 @@ public class DefaultExecutorRepository implements ExecutorRepository {
public void shutdownServiceReferExecutor() {
synchronized (LOCK) {
if (serviceReferExecutor != null && !serviceReferExecutor.isShutdown()) {
- serviceReferExecutor.shutdown();
+ try{
+ serviceReferExecutor.shutdown();
+ }catch (Throwable ignored){
+ logger.warn(ignored.getMessage(),ignored);
+ }
}
serviceReferExecutor = null;
@@ -312,11 +321,20 @@ public class DefaultExecutorRepository implements ExecutorRepository {
@Override
public void destroyAll() {
- poolRouterExecutor.shutdown();
+ try{
+ poolRouterExecutor.shutdown();
+ }catch (Throwable ignored){
+ // ignored
+ logger.warn(ignored.getMessage(),ignored);
+ }
// serviceDiscoveryAddressNotificationExecutor.shutdown();
// registryNotificationExecutor.shutdown();
- metadataRetryExecutor.shutdown();
-
+ try{
+ metadataRetryExecutor.shutdown();
+ }catch (Throwable ignored){
+ // ignored
+ logger.warn(ignored.getMessage(),ignored);
+ }
shutdownServiceExportExecutor();
shutdownServiceReferExecutor();
@@ -324,7 +342,12 @@ public class DefaultExecutorRepository implements ExecutorRepository {
if (executors != null) {
executors.values().forEach(executor -> {
if (executor != null && !executor.isShutdown()) {
- ExecutorUtil.shutdownNow(executor, 100);
+ try{
+ ExecutorUtil.shutdownNow(executor, 100);
+ }catch (Throwable ignored){
+ // ignored
+ logger.warn(ignored.getMessage(),ignored);
+ }
}
});
}
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index 9d7925f..672d91d 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
@@ -1377,7 +1377,11 @@ public class DubboBootstrap {
private void unexportMetadataService() {
if (metadataServiceExporter != null && metadataServiceExporter.isExported()) {
- metadataServiceExporter.unexport();
+ try{
+ metadataServiceExporter.unexport();
+ }catch (Exception ignored){
+ // ignored
+ }
}
}
@@ -1417,8 +1421,12 @@ public class DubboBootstrap {
private void unexportServices() {
exportedServices.forEach(sc -> {
- configManager.removeConfig(sc);
- sc.unexport();
+ try{
+ configManager.removeConfig(sc);
+ sc.unexport();
+ }catch (Exception ignored){
+ // ignored
+ }
});
asyncExportingFutures.forEach(future -> {
@@ -1463,17 +1471,20 @@ public class DubboBootstrap {
}
private void unreferServices() {
- if (cache == null) {
- cache = ReferenceConfigCache.getCache();
- }
-
- asyncReferringFutures.forEach(future -> {
- if (!future.isDone()) {
- future.cancel(true);
+ try{
+ if (cache == null) {
+ cache = ReferenceConfigCache.getCache();
}
- });
- asyncReferringFutures.clear();
- cache.destroyAll();
+
+ asyncReferringFutures.forEach(future -> {
+ if (!future.isDone()) {
+ future.cancel(true);
+ }
+ });
+ asyncReferringFutures.clear();
+ cache.destroyAll();
+ }catch (Exception ignored){
+ }
}
private void registerServiceInstance() {
@@ -1484,25 +1495,27 @@ public class DubboBootstrap {
ApplicationConfig application = getApplication();
String serviceName = application.getName();
ServiceInstance serviceInstance = createServiceInstance(serviceName);
-
+ boolean registered = true;
try {
doRegisterServiceInstance(serviceInstance);
} catch (Exception e) {
+ registered = false;
logger.error("Register instance error", e);
}
-
- // scheduled task for updating Metadata and ServiceInstance
- executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {
- InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();
- localMetadataService.blockUntilUpdated();
- try {
- ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
- } catch (Exception e) {
- logger.error("Refresh instance and metadata error", e);
- } finally {
- localMetadataService.releaseBlock();
- }
- }, 0, ConfigurationUtils.get(METADATA_PUBLISH_DELAY_KEY, DEFAULT_METADATA_PUBLISH_DELAY), TimeUnit.MILLISECONDS);
+ if(registered){
+ // scheduled task for updating Metadata and ServiceInstance
+ executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {
+ InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();
+ localMetadataService.blockUntilUpdated();
+ try {
+ ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
+ } catch (Exception e) {
+ logger.error("Refresh instance and metadata error", e);
+ } finally {
+ localMetadataService.releaseBlock();
+ }
+ }, 0, ConfigurationUtils.get(METADATA_PUBLISH_DELAY_KEY, DEFAULT_METADATA_PUBLISH_DELAY), TimeUnit.MILLISECONDS);
+ }
}
private void doRegisterServiceInstance(ServiceInstance serviceInstance) {
@@ -1536,7 +1549,11 @@ public class DubboBootstrap {
private void unregisterServiceInstance() {
if (serviceInstance != null) {
getServiceDiscoveries().forEach(serviceDiscovery -> {
- serviceDiscovery.unregister(serviceInstance);
+ try{
+ serviceDiscovery.unregister(serviceInstance);
+ }catch (Exception ignored){
+ // ignored
+ }
});
}
}
@@ -1578,7 +1595,10 @@ public class DubboBootstrap {
destroyDynamicConfigurations();
ShutdownHookCallbacks.INSTANCE.clear();
- } finally {
+ }catch (Throwable ignored){
+ // ignored
+ logger.warn(ignored.getMessage(),ignored);
+ }finally {
initialized.set(false);
startup.set(false);
destroyLock.unlock();
@@ -1635,7 +1655,11 @@ public class DubboBootstrap {
private void destroyServiceDiscoveries() {
getServiceDiscoveries().forEach(serviceDiscovery -> {
- execute(serviceDiscovery::destroy);
+ try{
+ execute(serviceDiscovery::destroy);
+ }catch (Throwable ignored){
+ logger.warn(ignored.getMessage(),ignored);
+ }
});
if (logger.isDebugEnabled()) {
logger.debug(NAME + "'s all ServiceDiscoveries have been destroyed.");
@@ -1684,7 +1708,12 @@ public class DubboBootstrap {
private void shutdown() {
if (!executorService.isShutdown()) {
// Shutdown executorService
- executorService.shutdown();
+ try{
+ executorService.shutdown();
+ }catch (Throwable ignored){
+ // ignored
+ logger.warn(ignored.getMessage(),ignored);
+ }
}
}
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java
index c483dcf..1f13a62 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java
@@ -19,7 +19,8 @@ package org.apache.dubbo.config.spring.reference;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
-import org.apache.dubbo.config.spring.registrycenter.ZooKeeperServer;
+import org.apache.dubbo.config.spring.registrycenter.DefaultSingleRegistryCenter;
+import org.apache.dubbo.config.spring.registrycenter.SingleRegistryCenter;
import org.apache.dubbo.config.spring.api.HelloService;
import org.apache.dubbo.config.spring.context.DubboConfigBeanInitializer;
import org.apache.dubbo.config.spring.context.annotation.provider.ProviderConfiguration;
@@ -59,14 +60,18 @@ import java.util.List;
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class DubboConfigBeanInitializerTest {
+ private static SingleRegistryCenter singleRegistryCenter;
@BeforeAll
public static void beforeAll() {
- ZooKeeperServer.start();
+ singleRegistryCenter = new DefaultSingleRegistryCenter();
+ singleRegistryCenter.startup();
+ DubboBootstrap.reset();
}
@AfterAll
public static void afterAll() {
- ZooKeeperServer.shutdown();
+ singleRegistryCenter.shutdown();
+ DubboBootstrap.reset();
}
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java
index a443519..d642f4c 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java
@@ -19,6 +19,8 @@ package org.apache.dubbo.config.spring.reference.localcall;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.config.spring.api.HelloService;
+import org.apache.dubbo.config.spring.registrycenter.DefaultSingleRegistryCenter;
+import org.apache.dubbo.config.spring.registrycenter.SingleRegistryCenter;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
@@ -37,14 +39,19 @@ import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)
public class LocalCallTest2 {
+ private static SingleRegistryCenter singleRegistryCenter;
+
@BeforeAll
public static void setUp() {
+ singleRegistryCenter = new DefaultSingleRegistryCenter();
+ singleRegistryCenter.startup();
DubboBootstrap.reset();
}
@AfterAll
public static void tearDown() {
DubboBootstrap.reset();
+ singleRegistryCenter.shutdown();
}
@DubboReference
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/log4j.xml b/dubbo-config/dubbo-config-spring/src/test/resources/log4j.xml
index 5d27202..2abd987 100644
--- a/dubbo-config/dubbo-config-spring/src/test/resources/log4j.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/log4j.xml
@@ -24,7 +24,7 @@
</appender>
<logger name="org.apache.dubbo.config" additivity="false">
- <level value="DEBUG"/>
+ <level value="WARN"/>
<appender-ref ref="CONSOLE"/>
</logger>
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java
index e7c348d..4e162d3 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java
@@ -17,6 +17,8 @@
package org.apache.dubbo.metadata.report.support;
import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.metadata.report.MetadataReport;
import org.apache.dubbo.metadata.report.MetadataReportFactory;
@@ -25,6 +27,8 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
public abstract class AbstractMetadataReportFactory implements MetadataReportFactory {
+
+ private static final Logger logger = LoggerFactory.getLogger(AbstractMetadataReportFactory.class);
private static final String EXPORT_KEY = "export";
private static final String REFER_KEY = "refer";
@@ -68,7 +72,12 @@ public abstract class AbstractMetadataReportFactory implements MetadataReportFac
LOCK.lock();
try {
for (MetadataReport metadataReport : SERVICE_STORE_MAP.values()) {
- metadataReport.destroy();
+ try{
+ metadataReport.destroy();
+ }catch (Throwable ignored){
+ // ignored
+ logger.warn(ignored.getMessage(),ignored);
+ }
}
SERVICE_STORE_MAP.clear();
} finally {
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
index bf696e4..deda9ac 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
@@ -100,7 +100,7 @@ public abstract class AbstractRegistryFactory implements RegistryFactory {
try {
registry.destroy();
} catch (Throwable e) {
- LOGGER.error(e.getMessage(), e);
+ LOGGER.warn(e.getMessage(), e);
}
}
REGISTRIES.clear();