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();