You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ga...@apache.org on 2016/04/01 03:33:45 UTC

activemq-artemis git commit: Fix thread leak in SoWriteTimeoutClientTest (exclude a thread from leak checking)

Repository: activemq-artemis
Updated Branches:
  refs/heads/refactor-openwire cae8a545a -> 298f274c4


Fix thread leak in SoWriteTimeoutClientTest
(exclude a thread from leak checking)


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/298f274c
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/298f274c
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/298f274c

Branch: refs/heads/refactor-openwire
Commit: 298f274c4965a0628f2af5d39020fb3ecb1af5e3
Parents: cae8a54
Author: Howard Gao <ho...@gmail.com>
Authored: Fri Apr 1 09:31:47 2016 +0800
Committer: Howard Gao <ho...@gmail.com>
Committed: Fri Apr 1 09:31:47 2016 +0800

----------------------------------------------------------------------
 .../artemis/tests/util/ThreadLeakCheckRule.java | 14 +++++
 .../transport/SoWriteTimeoutClientTest.java     | 64 +++++++++++++-------
 2 files changed, 57 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/298f274c/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
index 846d31b..232d3ae 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
@@ -17,7 +17,9 @@
 
 package org.apache.activemq.artemis.tests.util;
 
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.junit.Assert;
 import org.junit.rules.ExternalResource;
@@ -26,6 +28,7 @@ import org.junit.rules.ExternalResource;
  * This is useful to make sure you won't have leaking threads between tests
  */
 public class ThreadLeakCheckRule extends ExternalResource {
+   private static Set<String> extraThreads = new HashSet<String>();
 
    boolean enabled = true;
 
@@ -94,6 +97,11 @@ public class ThreadLeakCheckRule extends ExternalResource {
 
    }
 
+   public static void addExtraThreads(String... threads) {
+      for (String th : threads) {
+         extraThreads.add(th);
+      }
+   }
 
    private boolean checkThread() {
       boolean failedThread = false;
@@ -183,6 +191,9 @@ public class ThreadLeakCheckRule extends ExternalResource {
          // Static workers used by MQTT client.
          return true;
       }
+      else if (extraThreads.contains(threadName)) {
+         return true;
+      }
       else {
          for (StackTraceElement element : thread.getStackTrace()) {
             if (element.getClassName().contains("org.jboss.byteman.agent.TransformListener")) {
@@ -194,4 +205,7 @@ public class ThreadLeakCheckRule extends ExternalResource {
    }
 
 
+   public static void clearExtraThreads() {
+      extraThreads.clear();
+   }
 }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/298f274c/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
----------------------------------------------------------------------
diff --git a/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java b/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
index 0998599..48c36cf 100644
--- a/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
+++ b/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
@@ -26,17 +26,21 @@ import javax.jms.JMSException;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageProducer;
 import javax.jms.Session;
+import javax.jms.TextMessage;
 
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.activemq.artemis.core.config.Configuration;
 import org.apache.activemq.artemis.jms.server.config.impl.JMSConfigurationImpl;
 import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS;
+import org.apache.activemq.artemis.tests.util.ThreadLeakCheckRule;
 import org.apache.activemq.broker.artemiswrapper.OpenwireArtemisBaseTest;
 import org.apache.activemq.command.ActiveMQQueue;
 import org.apache.activemq.util.SocketProxy;
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,6 +51,17 @@ public class SoWriteTimeoutClientTest extends OpenwireArtemisBaseTest {
    private String messageTextPrefix = "";
    private EmbeddedJMS server;
 
+   @BeforeClass
+   public static void beforeTest() throws Exception {
+      //this thread keeps alive in original test too. Exclude it.
+      ThreadLeakCheckRule.addExtraThreads("WriteTimeoutFilter-Timeout-1");
+   }
+
+   @AfterClass
+   public static void afterTest() throws Exception {
+      ThreadLeakCheckRule.clearExtraThreads();
+   }
+
    @Before
    public void setUp() throws Exception {
       Configuration config = this.createConfig(0);
@@ -80,34 +95,41 @@ public class SoWriteTimeoutClientTest extends OpenwireArtemisBaseTest {
 
          ActiveMQConnectionFactory pFactory = new ActiveMQConnectionFactory("failover:(" + proxy.getUrl() + "?soWriteTimeout=4000&sleep=500)?jms.useAsyncSend=true&trackMessages=true&maxCacheSize=6638400");
          final Connection pc = pFactory.createConnection();
-         pc.start();
-         proxy.pause();
-
-         final int messageCount = 20;
-         ExecutorService executorService = Executors.newCachedThreadPool();
-         executorService.execute(new Runnable() {
-            @Override
-            public void run() {
-               try {
-                  sendMessages(pc, dest, messageCount);
-               }
-               catch (Exception ignored) {
-                  ignored.printStackTrace();
+         try {
+            pc.start();
+            proxy.pause();
+
+            final int messageCount = 20;
+            ExecutorService executorService = Executors.newCachedThreadPool();
+            executorService.execute(new Runnable() {
+               @Override
+               public void run() {
+                  try {
+                     sendMessages(pc, dest, messageCount);
+                  }
+                  catch (Exception ignored) {
+                     ignored.printStackTrace();
+                  }
                }
+            });
+
+            // wait for timeout and reconnect
+            TimeUnit.SECONDS.sleep(8);
+            proxy.goOn();
+            for (int i = 0; i < messageCount; i++) {
+               TextMessage m = (TextMessage) consumer.receive(10000);
+               Assert.assertNotNull("Got message " + i + " after reconnect", m);
             }
-         });
 
-         // wait for timeout and reconnect
-         TimeUnit.SECONDS.sleep(8);
-         proxy.goOn();
-         for (int i = 0; i < messageCount; i++) {
-            Assert.assertNotNull("Got message " + i + " after reconnect", consumer.receive(10000));
+            Assert.assertNull(consumer.receive(5000));
+         }
+         finally {
+            pc.close();
          }
-
-         Assert.assertNull(consumer.receive(5000));
       }
       finally {
          proxy.close();
+         c.close();
       }
 
    }