You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2019/04/01 14:33:52 UTC
[servicecomb-java-chassis] branch master updated: [SCB-1232] make
GroupExecutor configuration compatible to old version
This is an automated email from the ASF dual-hosted git repository.
wujimin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 89c0628 [SCB-1232] make GroupExecutor configuration compatible to old version
89c0628 is described below
commit 89c0628e50bc5677c88ad048fd822cfb68897f74
Author: wujimin <wu...@huawei.com>
AuthorDate: Sun Mar 31 16:18:31 2019 +0800
[SCB-1232] make GroupExecutor configuration compatible to old version
---
.../servicecomb/core/executor/GroupExecutor.java | 38 +++++---
.../core/executor/TestGroupExecutor.java | 108 +++++++++++++--------
2 files changed, 89 insertions(+), 57 deletions(-)
diff --git a/core/src/main/java/org/apache/servicecomb/core/executor/GroupExecutor.java b/core/src/main/java/org/apache/servicecomb/core/executor/GroupExecutor.java
index cf0c8e7..9dd27b8 100644
--- a/core/src/main/java/org/apache/servicecomb/core/executor/GroupExecutor.java
+++ b/core/src/main/java/org/apache/servicecomb/core/executor/GroupExecutor.java
@@ -40,7 +40,7 @@ public class GroupExecutor implements Executor, Closeable {
public static final String KEY_GROUP = "servicecomb.executor.default.group";
// Deprecated
- public static final String KEY_THREAD = "servicecomb.executor.default.thread-per-group";
+ public static final String KEY_OLD_MAX_THREAD = "servicecomb.executor.default.thread-per-group";
public static final String KEY_CORE_THREADS = "servicecomb.executor.default.coreThreads-per-group";
@@ -83,25 +83,31 @@ public class GroupExecutor implements Executor, Closeable {
}
public void initConfig() {
- groupCount = DynamicPropertyFactory.getInstance().getIntProperty(KEY_GROUP, 2).get();
- coreThreads = DynamicPropertyFactory.getInstance().getIntProperty(KEY_CORE_THREADS, 25).get();
-
- maxThreads = DynamicPropertyFactory.getInstance().getIntProperty(KEY_MAX_THREADS, -1).get();
- if (maxThreads <= 0) {
- maxThreads = DynamicPropertyFactory.getInstance().getIntProperty(KEY_THREAD, -1).get();
- if (maxThreads > 0) {
- LOGGER.warn("{} is deprecated, recommended to use {}.", KEY_THREAD, KEY_MAX_THREADS);
- } else {
- maxThreads = 100;
- }
- }
- if (coreThreads > maxThreads) {
- LOGGER.warn("coreThreads is bigger than maxThreads, change from {} to {}.", coreThreads, maxThreads);
+ LOGGER.info("JDK standard thread pool rules:\n"
+ + "1.use core threads.\n"
+ + "2.if all core threads are busy, then queue the request.\n"
+ + "3.if queue is full, then create new thread util reach the limit of max threads.\n"
+ + "4.if queue is full, and threads count is max, then reject the request.");
+
+ // the complex logic is to keep compatible
+ // otherwise can throw exception if configuration is invalid.
+ coreThreads = DynamicPropertyFactory.getInstance().getIntProperty(KEY_CORE_THREADS, -1).get();
+
+ int oldMaxThreads = DynamicPropertyFactory.getInstance().getIntProperty(KEY_OLD_MAX_THREAD, -1).get();
+ maxThreads = DynamicPropertyFactory.getInstance().getIntProperty(KEY_MAX_THREADS, oldMaxThreads).get();
+ maxThreads = Math.max(coreThreads, maxThreads);
+ maxThreads = maxThreads <= 0 ? 100 : maxThreads;
+
+ maxQueueSize = DynamicPropertyFactory.getInstance().getIntProperty(KEY_MAX_QUEUE_SIZE, Integer.MAX_VALUE).get();
+ if (maxQueueSize == Integer.MAX_VALUE) {
coreThreads = maxThreads;
+ LOGGER.info("not configured {}, make coreThreads and maxThreads to be {}.", KEY_MAX_QUEUE_SIZE, maxThreads);
+ } else {
+ coreThreads = coreThreads <= 0 ? 25 : coreThreads;
}
+ groupCount = DynamicPropertyFactory.getInstance().getIntProperty(KEY_GROUP, 2).get();
maxIdleInSecond = DynamicPropertyFactory.getInstance().getIntProperty(KEY_MAX_IDLE_SECOND, 60).get();
- maxQueueSize = DynamicPropertyFactory.getInstance().getIntProperty(KEY_MAX_QUEUE_SIZE, Integer.MAX_VALUE).get();
LOGGER.info(
"executor group={}. per group settings, coreThreads={}, maxThreads={}, maxIdleInSecond={}, maxQueueSize={}.",
diff --git a/core/src/test/java/org/apache/servicecomb/core/executor/TestGroupExecutor.java b/core/src/test/java/org/apache/servicecomb/core/executor/TestGroupExecutor.java
index a5dd87a..dfb6fe6 100644
--- a/core/src/test/java/org/apache/servicecomb/core/executor/TestGroupExecutor.java
+++ b/core/src/test/java/org/apache/servicecomb/core/executor/TestGroupExecutor.java
@@ -22,7 +22,6 @@ import java.util.Map;
import java.util.concurrent.Executor;
import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
-import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
@@ -56,16 +55,6 @@ public class TestGroupExecutor {
}
@Test
- public void coreThreads() {
- groupExecutor.initConfig();
- Assert.assertEquals(25, groupExecutor.coreThreads);
-
- ArchaiusUtils.setProperty(GroupExecutor.KEY_CORE_THREADS, 100);
- groupExecutor.initConfig();
- Assert.assertEquals(100, groupExecutor.coreThreads);
- }
-
- @Test
public void maxIdleInSecond() {
groupExecutor.initConfig();
Assert.assertEquals(60, groupExecutor.maxIdleInSecond);
@@ -86,46 +75,88 @@ public class TestGroupExecutor {
}
@Test
- public void maxThreads() {
+ public void threads_NotConfigQueue() {
groupExecutor.initConfig();
+ Assert.assertEquals(100, groupExecutor.coreThreads);
Assert.assertEquals(100, groupExecutor.maxThreads);
+ }
+
+ @Test
+ public void threads_NotConfigQueue_onlyOldMax() {
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_OLD_MAX_THREAD, 30);
- LogCollector collector = new LogCollector();
- ArchaiusUtils.setProperty(GroupExecutor.KEY_THREAD, 200);
groupExecutor.initConfig();
- Assert.assertEquals(200, groupExecutor.maxThreads);
- Assert.assertEquals(
- "servicecomb.executor.default.thread-per-group is deprecated, recommended to use servicecomb.executor.default.maxThreads-per-group.",
- collector.getEvents().get(collector.getEvents().size() - 2).getMessage());
- collector.teardown();
+ Assert.assertEquals(30, groupExecutor.coreThreads);
+ Assert.assertEquals(30, groupExecutor.maxThreads);
+ }
+
+ @Test
+ public void threads_NotConfigQueue_ignoreOldMax() {
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_OLD_MAX_THREAD, 30);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_CORE_THREADS, 10);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_THREADS, 20);
- ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_THREADS, 300);
groupExecutor.initConfig();
- Assert.assertEquals(300, groupExecutor.maxThreads);
+ Assert.assertEquals(20, groupExecutor.coreThreads);
+ Assert.assertEquals(20, groupExecutor.maxThreads);
}
@Test
- public void adjustCoreThreads() {
- ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_THREADS, 10);
+ public void threads_NotConfigQueue_adjust() {
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_CORE_THREADS, 30);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_THREADS, 20);
- LogCollector collector = new LogCollector();
groupExecutor.initConfig();
- Assert.assertEquals(10, groupExecutor.maxThreads);
- Assert.assertEquals(
- "coreThreads is bigger than maxThreads, change from 25 to 10.",
- collector.getEvents().get(collector.getEvents().size() - 2).getMessage());
- collector.teardown();
+ Assert.assertEquals(30, groupExecutor.coreThreads);
+ Assert.assertEquals(30, groupExecutor.maxThreads);
}
@Test
- public void testGroupExecutor() {
- groupExecutor.init();
- groupExecutor.execute(new Runnable() {
+ public void threads_configQueue() {
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_QUEUE_SIZE, 100);
- @Override
- public void run() {
+ groupExecutor.initConfig();
+ Assert.assertEquals(25, groupExecutor.coreThreads);
+ Assert.assertEquals(100, groupExecutor.maxThreads);
+ }
- }
+ @Test
+ public void threads_configQueue_oldOldMax() {
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_QUEUE_SIZE, 100);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_OLD_MAX_THREAD, 30);
+
+ groupExecutor.initConfig();
+ Assert.assertEquals(25, groupExecutor.coreThreads);
+ Assert.assertEquals(30, groupExecutor.maxThreads);
+ }
+
+ @Test
+ public void threads_configQueue_ignoreOldMax() {
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_QUEUE_SIZE, 100);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_OLD_MAX_THREAD, 30);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_CORE_THREADS, 10);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_THREADS, 20);
+
+ groupExecutor.initConfig();
+ Assert.assertEquals(10, groupExecutor.coreThreads);
+ Assert.assertEquals(20, groupExecutor.maxThreads);
+ }
+
+ @Test
+ public void threads_configQueue_adjust() {
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_QUEUE_SIZE, 100);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_CORE_THREADS, 30);
+ ArchaiusUtils.setProperty(GroupExecutor.KEY_MAX_THREADS, 20);
+
+ groupExecutor.initConfig();
+ Assert.assertEquals(30, groupExecutor.coreThreads);
+ Assert.assertEquals(30, groupExecutor.maxThreads);
+ }
+
+ @Test
+ public void testGroupExecutor() {
+ groupExecutor.init();
+ groupExecutor.execute(() -> {
});
Map<Long, Executor> threadExecutorMap = Deencapsulation.getField(groupExecutor, "threadExecutorMap");
Assert.assertEquals(true, (threadExecutorMap.size() > 0));
@@ -134,12 +165,7 @@ public class TestGroupExecutor {
Assert.assertEquals(true, (executorList.size() > 1));
ReactiveExecutor oReactiveExecutor = new ReactiveExecutor();
- oReactiveExecutor.execute(new Runnable() {
- @Override
- public void run() {
- strThreadTest = "thread Ran";
- }
- });
+ oReactiveExecutor.execute(() -> strThreadTest = "thread Ran");
oReactiveExecutor.close();
Assert.assertEquals("thread Ran", strThreadTest);
}