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/04 14:41:13 UTC

[servicecomb-java-chassis] branch master updated: [SCB-1239] close thread after finish unit test case at once.

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 7c48e33  [SCB-1239] close thread after finish unit test case at once.
7c48e33 is described below

commit 7c48e33f1ba2495a0b6d1b0399e42aad2792a8f7
Author: wujimin <wu...@huawei.com>
AuthorDate: Thu Apr 4 10:59:53 2019 +0800

    [SCB-1239] close thread after finish unit test case at once.
---
 .../core/transport/TransportVertxFactory.java      | 37 +++++++++++++++-------
 .../core/executor/TestThreadPoolExecutorEx.java    | 19 +++++------
 .../core/transport/TestAbstractTransport.java      |  2 +-
 .../servicecomb/foundation/vertx/VertxUtils.java   | 21 +++++++++++-
 .../foundation/vertx/TestVertxUtils.java           |  6 ++--
 .../servicecomb/faultinjection/AbortFaultTest.java |  2 +-
 .../servicecomb/faultinjection/DelayFaultTest.java |  2 +-
 .../faultinjection/TestFaultInjectHandler.java     |  2 +-
 .../transport/highway/TestHighwayTransport.java    | 19 +++++++++--
 9 files changed, 78 insertions(+), 32 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java b/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java
index d4e96d3..c2227fb 100644
--- a/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java
+++ b/core/src/main/java/org/apache/servicecomb/core/transport/TransportVertxFactory.java
@@ -22,27 +22,42 @@ import org.apache.servicecomb.foundation.vertx.metrics.MetricsOptionsEx;
 
 import io.vertx.core.Vertx;
 import io.vertx.core.VertxOptions;
+import io.vertx.core.shareddata.Shareable;
 
 public class TransportVertxFactory {
-  private VertxOptions vertxOptions = new VertxOptions();
+  static class TransportVertxInfo implements Shareable {
+    public VertxOptions vertxOptions = new VertxOptions();
 
-  private DefaultVertxMetricsFactory metricsFactory = new DefaultVertxMetricsFactory();
+    public DefaultVertxMetricsFactory metricsFactory = new DefaultVertxMetricsFactory();
 
-  private MetricsOptionsEx metricsOptionsEx = (MetricsOptionsEx) metricsFactory.newOptions();
+    public MetricsOptionsEx metricsOptionsEx = (MetricsOptionsEx) metricsFactory.newOptions();
 
-  private Vertx transportVertx;
-
-  public TransportVertxFactory() {
-    vertxOptions.setMetricsOptions(metricsOptionsEx);
-    transportVertx = VertxUtils.getOrCreateVertxByName("transport", vertxOptions);
-    metricsFactory.setVertx(transportVertx, vertxOptions);
+    public TransportVertxInfo() {
+      vertxOptions.setMetricsOptions(metricsOptionsEx);
+    }
   }
 
+  private static final String LOCAL_MAP_NAME = "scb";
+
+  private static final String INFO = "transport-vertx-info";
+
   public DefaultVertxMetricsFactory getMetricsFactory() {
-    return metricsFactory;
+    TransportVertxInfo info = (TransportVertxInfo) getTransportVertx().sharedData().getLocalMap(LOCAL_MAP_NAME)
+        .get(INFO);
+    return info.metricsFactory;
   }
 
   public Vertx getTransportVertx() {
-    return transportVertx;
+    return VertxUtils.getVertxMap().computeIfAbsent("transport", this::createTransportVertx);
+  }
+
+  private Vertx createTransportVertx(String name) {
+    TransportVertxInfo info = new TransportVertxInfo();
+
+    Vertx vertx = VertxUtils.init(info.vertxOptions);
+    info.metricsFactory.setVertx(vertx, info.vertxOptions);
+    vertx.sharedData().getLocalMap(LOCAL_MAP_NAME).put(INFO, info);
+
+    return vertx;
   }
 }
diff --git a/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java b/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java
index a2567e4..163fbb9 100644
--- a/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java
+++ b/core/src/test/java/org/apache/servicecomb/core/executor/TestThreadPoolExecutorEx.java
@@ -17,6 +17,8 @@
 package org.apache.servicecomb.core.executor;
 
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
 
@@ -27,24 +29,19 @@ public class TestThreadPoolExecutorEx {
   static class TestTask implements Runnable {
     CountDownLatch notify = new CountDownLatch(1);
 
-    CountDownLatch wait = new CountDownLatch(1);
+    Future<?> future;
 
-    public void quit() {
+    public void quit() throws ExecutionException, InterruptedException {
       notify.countDown();
-      try {
-        wait.await();
-      } catch (InterruptedException e) {
-        e.printStackTrace();
-      }
+      future.get();
     }
 
     @Override
     public void run() {
       try {
         notify.await();
-        wait.countDown();
       } catch (InterruptedException e) {
-        e.printStackTrace();
+        throw new IllegalStateException(e);
       }
     }
   }
@@ -54,12 +51,12 @@ public class TestThreadPoolExecutorEx {
 
   public TestTask submitTask() {
     TestTask task = new TestTask();
-    executorEx.execute(task);
+    task.future = executorEx.submit(task);
     return task;
   }
 
   @Test
-  public void schedule() {
+  public void schedule() throws ExecutionException, InterruptedException {
     // init
     Assert.assertEquals(0, executorEx.getPoolSize());
     Assert.assertEquals(0, executorEx.getRejectedCount());
diff --git a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
index eeff175..2d3658a 100644
--- a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
+++ b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
@@ -84,7 +84,7 @@ public class TestAbstractTransport {
 
   @AfterClass
   public static void classTeardown() {
-    VertxUtils.closeVertxByName("transport");
+    VertxUtils.blockCloseVertxByName("transport");
   }
 
   @Test
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java
index 2082ef0..06484be 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java
@@ -216,7 +216,26 @@ public final class VertxUtils {
     try {
       future.get();
     } catch (Throwable e) {
-      LOGGER.error("Failed to close vertx {}.", name, e);
+      LOGGER.error("Failed to wait close vertx {}.", name, e);
+    }
+  }
+
+  public static void blockCloseVertx(Vertx vertx) {
+    CountDownLatch latch = new CountDownLatch(1);
+    vertx.close(ar -> {
+      if (ar.succeeded()) {
+        LOGGER.info("Success to close vertx {}.", vertx);
+      } else {
+        LOGGER.info("Failed to close vertx {}.", vertx);
+      }
+
+      latch.countDown();
+    });
+
+    try {
+      latch.await();
+    } catch (InterruptedException e) {
+      LOGGER.info("Failed to wait close vertx {}.", vertx);
     }
   }
 }
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java
index ee800d2..3da853d 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/TestVertxUtils.java
@@ -28,6 +28,7 @@ import javax.xml.ws.Holder;
 import org.apache.commons.io.FileUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.vertx.stream.BufferInputStream;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -39,7 +40,6 @@ import io.vertx.core.buffer.Buffer;
 import io.vertx.core.file.impl.FileResolver;
 
 public class TestVertxUtils {
-
   @Test
   public void testGetOrCreateVertx() throws InterruptedException {
     Vertx vertx = VertxUtils.getOrCreateVertxByName("ut", null);
@@ -86,7 +86,7 @@ public class TestVertxUtils {
   public void testVertxUtilsInitNullOptions() {
     Vertx vertx = VertxUtils.init(null);
     Assert.assertNotEquals(null, vertx);
-    vertx.close();
+    VertxUtils.blockCloseVertx(vertx);
   }
 
   @Test
@@ -96,7 +96,7 @@ public class TestVertxUtils {
 
     Vertx vertx = VertxUtils.init(oOptions);
     Assert.assertNotEquals(null, vertx);
-    vertx.close();
+    VertxUtils.blockCloseVertx(vertx);
   }
 
   @Test
diff --git a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java
index da606e0..ceddd85 100644
--- a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java
+++ b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/AbortFaultTest.java
@@ -70,7 +70,7 @@ public class AbortFaultTest {
 
   @AfterClass
   public static void classTeardown() {
-    VertxUtils.closeVertxByName("faultinjectionTest");
+    VertxUtils.blockCloseVertxByName("faultinjectionTest");
   }
 
   @Test
diff --git a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java
index 7b5452d..dcaa99e 100644
--- a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java
+++ b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/DelayFaultTest.java
@@ -71,7 +71,7 @@ public class DelayFaultTest {
 
   @AfterClass
   public static void classTeardown() {
-    VertxUtils.closeVertxByName("faultinjectionTest");
+    VertxUtils.blockCloseVertxByName("faultinjectionTest");
   }
 
   @Test
diff --git a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java
index bc5585c..86727b0 100644
--- a/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java
+++ b/handlers/handler-fault-injection/src/test/java/org/apache/servicecomb/faultinjection/TestFaultInjectHandler.java
@@ -100,7 +100,7 @@ public class TestFaultInjectHandler {
 
   @AfterClass
   public static void classTeardown() {
-    VertxUtils.closeVertxByName("faultinjectionTest");
+    VertxUtils.blockCloseVertxByName("faultinjectionTest");
   }
 
   /**
diff --git a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java
index a367815..63e493e 100644
--- a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java
+++ b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayTransport.java
@@ -27,17 +27,34 @@ import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
+import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import mockit.Mock;
 import mockit.MockUp;
 
 public class TestHighwayTransport {
+  private static final Logger LOGGER = LoggerFactory.getLogger(TestHighwayTransport.class);
 
   private HighwayTransport transport = new HighwayTransport();
 
+  @BeforeClass
+  public static void setup() {
+    VertxUtils.blockCloseVertxByName("transport");
+    Thread.getAllStackTraces().keySet().forEach(t->LOGGER.info("before: {}", t.getName()));
+  }
+
+  @AfterClass
+  public static void teardown() {
+    VertxUtils.blockCloseVertxByName("transport");
+    Thread.getAllStackTraces().keySet().forEach(t->LOGGER.info("after: {}", t.getName()));
+  }
+
   @Test
   public void testGetInstance() {
     Assert.assertNotNull(transport);
@@ -50,8 +67,6 @@ public class TestHighwayTransport {
       transport.init();
     } catch (Exception e) {
       status = false;
-    } finally {
-      VertxUtils.blockCloseVertxByName("transport");
     }
 
     Assert.assertTrue(status);