From 4568958ef597e878fb5b4f318fa06d04a779cfd6 Mon Sep 17 00:00:00 2001 From: huazhongming Date: Mon, 28 Nov 2022 16:56:31 +0800 Subject: [PATCH] Adjust the logic of timeout, fix triple about timeout countdown function problem (#11030) Signed-off-by: crazyhzm Signed-off-by: crazyhzm --- .../apache/dubbo/rpc/support/RpcUtils.java | 21 +++++++------------ .../rpc/protocol/dubbo/DubboInvoker.java | 2 +- .../rpc/protocol/injvm/InjvmInvoker.java | 2 +- .../dubbo/rpc/protocol/tri/TripleInvoker.java | 7 ++----- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java index 816350eaa8..3348565c24 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java @@ -261,26 +261,21 @@ public class RpcUtils { return timeout; } - public static long getTimeout(URL url, String methodName, RpcContext context, long defaultTimeout) { + public static long getTimeout(URL url, String methodName, RpcContext context, Invocation invocation, long defaultTimeout) { long timeout = defaultTimeout; - Object genericTimeout = context.getObjectAttachment(TIMEOUT_KEY); - if (genericTimeout != null) { - timeout = convertToNumber(genericTimeout, defaultTimeout); + Object timeoutFromContext = context.getObjectAttachment(TIMEOUT_KEY); + Object timeoutFromInvocation = invocation.getObjectAttachment(TIMEOUT_KEY); + + if (timeoutFromContext != null) { + timeout = convertToNumber(timeoutFromContext, defaultTimeout); + } else if (timeoutFromInvocation != null) { + timeout = convertToNumber(timeoutFromInvocation, defaultTimeout); } else if (url != null) { timeout = url.getMethodPositiveParameter(methodName, TIMEOUT_KEY, defaultTimeout); } return timeout; } - public static long getTimeoutFromInvocation(Invocation invocation, long defaultTimeout) { - long timeout = defaultTimeout; - Object genericTimeout = invocation.getObjectAttachment(TIMEOUT_KEY); - if (genericTimeout != null) { - timeout = convertToNumber(genericTimeout, defaultTimeout); - } - return timeout; - } - private static long convertToNumber(Object obj, long defaultTimeout) { long timeout = defaultTimeout; try { 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 568740d1cf..d2d324f133 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 @@ -178,7 +178,7 @@ public class DubboInvoker extends AbstractInvoker { Object countdown = RpcContext.getClientAttachment().getObjectAttachment(TIME_COUNTDOWN_KEY); int timeout; if (countdown == null) { - timeout = (int) RpcUtils.getTimeout(getUrl(), methodName, RpcContext.getClientAttachment(), DEFAULT_TIMEOUT); + timeout = (int) RpcUtils.getTimeout(getUrl(), methodName, RpcContext.getClientAttachment(), invocation, DEFAULT_TIMEOUT); if (getUrl().getParameter(ENABLE_TIMEOUT_COUNTDOWN_KEY, false)) { invocation.setObjectAttachment(TIMEOUT_ATTACHMENT_KEY, timeout); // pass timeout to remote server } diff --git a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java index c06a815fdb..217aa8ff8d 100644 --- a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java +++ b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java @@ -283,7 +283,7 @@ public class InjvmInvoker extends AbstractInvoker { Object countdown = RpcContext.getClientAttachment().getObjectAttachment(TIME_COUNTDOWN_KEY); int timeout; if (countdown == null) { - timeout = (int) RpcUtils.getTimeout(getUrl(), methodName, RpcContext.getClientAttachment(), DEFAULT_TIMEOUT); + timeout = (int) RpcUtils.getTimeout(getUrl(), methodName, RpcContext.getClientAttachment(), invocation, DEFAULT_TIMEOUT); if (getUrl().getParameter(ENABLE_TIMEOUT_COUNTDOWN_KEY, false)) { invocation.setObjectAttachment(TIMEOUT_ATTACHMENT_KEY, timeout); // pass timeout to remote server } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java index db6ed19911..ca0a9f77f0 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java @@ -106,7 +106,7 @@ public class TripleInvoker extends AbstractInvoker { if (!connection.isAvailable()) { CompletableFuture future = new CompletableFuture<>(); RpcException exception = TriRpcStatus.UNAVAILABLE.withDescription( - String.format("upstream %s is unavailable", getUrl().getAddress())) + String.format("upstream %s is unavailable", getUrl().getAddress())) .asException(); future.completeExceptionally(exception); return new AsyncRpcResult(future, invocation); @@ -301,14 +301,11 @@ public class TripleInvoker extends AbstractInvoker { } private int calculateTimeout(Invocation invocation, String methodName) { - if (invocation.getObjectAttachment(TIMEOUT_KEY) != null) { - return (int) RpcUtils.getTimeoutFromInvocation(invocation, 3000); - } Object countdown = RpcContext.getClientAttachment().getObjectAttachment(TIME_COUNTDOWN_KEY); int timeout; if (countdown == null) { timeout = (int) RpcUtils.getTimeout(getUrl(), methodName, - RpcContext.getClientAttachment(), 3000); + RpcContext.getClientAttachment(), invocation, 3000); if (getUrl().getParameter(ENABLE_TIMEOUT_COUNTDOWN_KEY, false)) { invocation.setObjectAttachment(TIMEOUT_ATTACHMENT_KEY, timeout); // pass timeout to remote server