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