This is an automated email from the ASF dual-hosted git repository.
iluo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/master by this push:
new 69e7204 [DUBBO-3023]: problem in ActiveLimitFilter (#3035)
69e7204 is described below
commit 69e72041943f247360249ba191ac1217217f43a5
Author: Ian Luo <[email protected]>
AuthorDate: Fri Dec 21 21:58:54 2018 +0800
[DUBBO-3023]: problem in ActiveLimitFilter (#3035)
* #3023: problem in ActiveLimitFilter
* fix problem when max <= 0
---
.../src/main/java/org/apache/dubbo/rpc/RpcStatus.java | 1 +
.../org/apache/dubbo/rpc/filter/ActiveLimitFilter.java | 2 +-
.../org/apache/dubbo/rpc/filter/ExecuteLimitFilter.java | 2 +-
.../apache/dubbo/rpc/filter/ActiveLimitFilterTest.java | 16 ++++++++++++++++
4 files changed, 19 insertions(+), 2 deletions(-)
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
index de68434..d3a2032 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcStatus.java
@@ -109,6 +109,7 @@ public class RpcStatus {
* @param url
*/
public static boolean beginCount(URL url, String methodName, int max) {
+ max = (max <= 0) ? Integer.MAX_VALUE : max;
RpcStatus appStatus = getStatus(url);
RpcStatus methodStatus = getStatus(url, methodName);
if (methodStatus.active.incrementAndGet() > max) {
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ActiveLimitFilter.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ActiveLimitFilter.java
index 696840f..926fd01 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ActiveLimitFilter.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ActiveLimitFilter.java
@@ -47,7 +47,7 @@ public class ActiveLimitFilter implements Filter {
String methodName = invocation.getMethodName();
int max = invoker.getUrl().getMethodParameter(methodName,
Constants.ACTIVES_KEY, 0);
RpcStatus count = RpcStatus.getStatus(invoker.getUrl(),
invocation.getMethodName());
- if (max > 0 && !RpcStatus.beginCount(url, methodName, max)) {
+ if (!RpcStatus.beginCount(url, methodName, max)) {
long timeout =
invoker.getUrl().getMethodParameter(invocation.getMethodName(),
Constants.TIMEOUT_KEY, 0);
long start = System.currentTimeMillis();
long remain = timeout;
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ExecuteLimitFilter.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ExecuteLimitFilter.java
index d0995da..b335a41 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ExecuteLimitFilter.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ExecuteLimitFilter.java
@@ -40,7 +40,7 @@ public class ExecuteLimitFilter implements Filter {
URL url = invoker.getUrl();
String methodName = invocation.getMethodName();
int max = url.getMethodParameter(methodName, Constants.EXECUTES_KEY,
0);
- if (max > 0 && !RpcStatus.beginCount(url, methodName, max)) {
+ if (!RpcStatus.beginCount(url, methodName, max)) {
throw new RpcException("Failed to invoke method " +
invocation.getMethodName() + " in provider " +
url + ", cause: The service using threads greater than
<dubbo:service executes=\"" + max +
"\" /> limited.");
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/ActiveLimitFilterTest.java
b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/ActiveLimitFilterTest.java
index 012951d..2dff886 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/ActiveLimitFilterTest.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter/ActiveLimitFilterTest.java
@@ -195,4 +195,20 @@ public class ActiveLimitFilterTest {
assertEquals("After exception active count should be same"
, beforeExceptionActiveCount, afterExceptionActiveCount);
}
+
+ @Test
+ public void testInvokeRuntimeExceptionWithActiveCountMatch() {
+ URL url =
URL.valueOf("test://test:11/test?accesslog=true&group=dubbo&version=1.1&actives=0");
+ Invoker<ActiveLimitFilterTest> invoker = new
RuntimeExceptionInvoker(url);
+ Invocation invocation = new MockInvocation();
+ RpcStatus count = RpcStatus.getStatus(invoker.getUrl(),
invocation.getMethodName());
+ int beforeExceptionActiveCount = count.getActive();
+ try {
+ activeLimitFilter.invoke(invoker, invocation);
+ } catch (RuntimeException ex) {
+ int afterExceptionActiveCount = count.getActive();
+ assertEquals("After exception active count should be same"
+ , beforeExceptionActiveCount, afterExceptionActiveCount);
+ }
+ }
}