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

liujun pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new 6ad735d74a Fix server shutdown await timeout (#12644)
6ad735d74a is described below

commit 6ad735d74a7f1c5d694f212061e04af9c90a8d3b
Author: Albumen Kevin <[email protected]>
AuthorDate: Mon Jul 3 10:16:14 2023 +0800

    Fix server shutdown await timeout (#12644)
---
 .../dubbo/common/config/ConfigurationUtils.java    | 26 ++++++++++++++++++++++
 .../org/apache/dubbo/config/DubboShutdownHook.java |  4 +++-
 .../support/header/HeaderExchangeChannel.java      |  4 ++--
 .../support/header/HeaderExchangeHandler.java      |  2 +-
 .../netty4/NettyPortUnificationServer.java         |  2 +-
 .../remoting/transport/netty4/NettyServer.java     |  2 +-
 .../rpc/protocol/ReferenceCountInvokerWrapper.java | 12 +++++++++-
 .../dubbo/rpc/protocol/dubbo/DubboInvoker.java     |  2 +-
 .../dubbo/rpc/protocol/dubbo/DubboProtocol.java    |  2 +-
 .../rpc/protocol/dubbo/SharedClientsProvider.java  |  3 ++-
 10 files changed, 49 insertions(+), 10 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
index dae8a0ca03..73c189dae7 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
@@ -60,6 +60,8 @@ public final class ConfigurationUtils {
     private static final ErrorTypeAwareLogger logger = 
LoggerFactory.getErrorTypeAwareLogger(ConfigurationUtils.class);
     private static final List<String> securityKey;
 
+    private static volatile long expectedShutdownTime = Long.MAX_VALUE;
+
     static {
         List<String> keys = new LinkedList<>();
         keys.add("accesslog");
@@ -113,6 +115,9 @@ public final class ConfigurationUtils {
      */
     @SuppressWarnings("deprecation")
     public static int getServerShutdownTimeout(ScopeModel scopeModel) {
+        if (expectedShutdownTime < System.currentTimeMillis()) {
+            return 1;
+        }
         int timeout = DEFAULT_SERVER_SHUTDOWN_TIMEOUT;
         Configuration configuration = getGlobalConfiguration(scopeModel);
         String value = 
StringUtils.trim(configuration.getString(SHUTDOWN_WAIT_KEY));
@@ -133,9 +138,30 @@ public final class ConfigurationUtils {
                 }
             }
         }
+
+        if (expectedShutdownTime - System.currentTimeMillis() < timeout) {
+            return (int) Math.max(1, expectedShutdownTime - 
System.currentTimeMillis());
+        }
+
         return timeout;
     }
 
+    public static int reCalShutdownTime(int expectedShutdownTime) {
+        if (expectedShutdownTime < System.currentTimeMillis()) {
+            return 1;
+        }
+
+        if (expectedShutdownTime - System.currentTimeMillis() < 
expectedShutdownTime) {
+            return (int) Math.max(1, expectedShutdownTime - 
System.currentTimeMillis());
+        }
+
+        return expectedShutdownTime;
+    }
+
+    public static void setExpectedShutdownTime(long expectedShutdownTime) {
+        ConfigurationUtils.expectedShutdownTime = expectedShutdownTime;
+    }
+
     public static String getCachedDynamicProperty(ScopeModel realScopeModel, 
String key, String defaultValue) {
         ScopeModel scopeModel = 
getScopeModelOrDefaultApplicationModel(realScopeModel);
         ConfigurationCache configurationCache = 
scopeModel.getBeanFactory().getBean(ConfigurationCache.class);
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
index def7a7ac74..a8dc78d606 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
@@ -82,6 +82,9 @@ public class DubboShutdownHook extends Thread {
     }
 
     private void doDestroy() {
+        int timeout = 
ConfigurationUtils.getServerShutdownTimeout(applicationModel);
+        ConfigurationUtils.setExpectedShutdownTime(System.currentTimeMillis() 
+ timeout);
+
         // send readonly for shutdown hook
         List<GracefulShutdown> gracefulShutdowns = 
GracefulShutdown.getGracefulShutdowns(applicationModel.getFrameworkModel());
         for (GracefulShutdown gracefulShutdown : gracefulShutdowns) {
@@ -97,7 +100,6 @@ public class DubboShutdownHook extends Thread {
             }
         }
         if (hasModuleBindSpring) {
-            int timeout = 
ConfigurationUtils.getServerShutdownTimeout(applicationModel);
             if (timeout > 0) {
                 long start = System.currentTimeMillis();
                 /*
diff --git 
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java
 
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java
index 5bb08fa8e2..b4c7bb65a3 100644
--- 
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java
+++ 
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java
@@ -50,7 +50,7 @@ final class HeaderExchangeChannel implements ExchangeChannel {
 
     private final Channel channel;
 
-    private final long shutdownTimeout;
+    private final int shutdownTimeout;
 
     private volatile boolean closed = false;
 
@@ -167,7 +167,7 @@ final class HeaderExchangeChannel implements 
ExchangeChannel {
         closed = true;
         try {
             // graceful close
-            DefaultFuture.closeChannel(channel, shutdownTimeout);
+            DefaultFuture.closeChannel(channel, 
ConfigurationUtils.reCalShutdownTime(shutdownTimeout));
         } catch (Exception e) {
             logger.warn(TRANSPORT_FAILED_CLOSE, "", "", e.getMessage(), e);
         }
diff --git 
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java
 
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java
index 2fe6253140..d1fc4cdd1a 100644
--- 
a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java
+++ 
b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeHandler.java
@@ -148,7 +148,7 @@ public class HeaderExchangeHandler implements 
ChannelHandlerDelegate {
             if (timeoutObj instanceof Integer) {
                 shutdownTimeout = (Integer) timeoutObj;
             }
-            DefaultFuture.closeChannel(channel, shutdownTimeout);
+            DefaultFuture.closeChannel(channel, 
ConfigurationUtils.reCalShutdownTime(shutdownTimeout));
             HeaderExchangeChannel.removeChannel(channel);
         }
     }
diff --git 
a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyPortUnificationServer.java
 
b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyPortUnificationServer.java
index 42d8d89895..f5fdc9a919 100644
--- 
a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyPortUnificationServer.java
+++ 
b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyPortUnificationServer.java
@@ -178,7 +178,7 @@ public class NettyPortUnificationServer extends 
AbstractPortUnificationServer {
 
         try {
             if (bootstrap != null) {
-                long timeout = serverShutdownTimeoutMills;
+                long timeout = 
ConfigurationUtils.reCalShutdownTime(serverShutdownTimeoutMills);
                 long quietPeriod = Math.min(2000L, timeout);
                 Future<?> bossGroupShutdownFuture = 
bossGroup.shutdownGracefully(quietPeriod,
                     timeout, MILLISECONDS);
diff --git 
a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java
 
b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java
index 45b3ac90cf..8511370b5d 100644
--- 
a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java
+++ 
b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java
@@ -174,7 +174,7 @@ public class NettyServer extends AbstractServer {
         }
         try {
             if (bootstrap != null) {
-                long timeout = serverShutdownTimeoutMills;
+                long timeout = 
ConfigurationUtils.reCalShutdownTime(serverShutdownTimeoutMills);
                 long quietPeriod = Math.min(2000L, timeout);
                 Future<?> bossGroupShutdownFuture = 
bossGroup.shutdownGracefully(quietPeriod, timeout, MILLISECONDS);
                 Future<?> workerGroupShutdownFuture = 
workerGroup.shutdownGracefully(quietPeriod, timeout, MILLISECONDS);
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/ReferenceCountInvokerWrapper.java
 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/ReferenceCountInvokerWrapper.java
index 1326cf16a4..9cca735949 100644
--- 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/ReferenceCountInvokerWrapper.java
+++ 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/ReferenceCountInvokerWrapper.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.rpc.protocol;
 
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.config.ConfigurationUtils;
 import org.apache.dubbo.common.constants.LoggerCodeConstants;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
@@ -25,6 +26,7 @@ import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcException;
 
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -53,8 +55,16 @@ public class ReferenceCountInvokerWrapper<T> implements 
Invoker<T> {
     @Override
     public void destroy() {
         try {
-            lock.writeLock().lock();
+            int timeout = 
ConfigurationUtils.getServerShutdownTimeout(invoker.getUrl().getScopeModel());
+            boolean locked = lock.writeLock().tryLock(
+                timeout, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                logger.warn(LoggerCodeConstants.PROTOCOL_CLOSED_SERVER, "", "",
+                    "Failed to wait for invocation end in " + timeout + "ms.");
+            }
             destroyed.set(true);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
         } finally {
             lock.writeLock().unlock();
         }
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
index 64ec05dc8f..25657a26cb 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java
@@ -179,7 +179,7 @@ public class DubboInvoker<T> extends AbstractInvoker<T> {
                 if (invokers != null) {
                     invokers.remove(this);
                 }
-                clientsProvider.close(serverShutdownTimeout);
+                
clientsProvider.close(ConfigurationUtils.reCalShutdownTime(serverShutdownTimeout));
             } finally {
                 destroyLock.unlock();
             }
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java
index 2483f78d00..b9baa3b386 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java
@@ -554,7 +554,7 @@ public class DubboProtocol extends AbstractProtocol {
                     logger.info("Closing dubbo server: " + 
server.getLocalAddress());
                 }
 
-                server.close(getServerShutdownTimeout(protocolServer));
+                
server.close(ConfigurationUtils.reCalShutdownTime(getServerShutdownTimeout(protocolServer)));
 
             } catch (Throwable t) {
                 logger.warn(PROTOCOL_ERROR_CLOSE_SERVER, "", "", "Close dubbo 
server [" + server.getLocalAddress() + "] failed: " + t.getMessage(), t);
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/SharedClientsProvider.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/SharedClientsProvider.java
index 1f527f7506..83ca0cfce2 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/SharedClientsProvider.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/SharedClientsProvider.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.rpc.protocol.dubbo;
 
+import org.apache.dubbo.common.config.ConfigurationUtils;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.CollectionUtils;
@@ -116,7 +117,7 @@ public class SharedClientsProvider implements 
ClientsProvider {
                 logger.info("Close dubbo connect: " + client.getLocalAddress() 
+ "-->" + client.getRemoteAddress());
             }
 
-            client.close(client.getShutdownWaitTime());
+            
client.close(ConfigurationUtils.reCalShutdownTime(client.getShutdownWaitTime()));
 
             // TODO
             /*

Reply via email to