Repository: ignite
Updated Branches:
  refs/heads/master 88d5ff8f9 -> 76297e2b2


IGNITE-8584 Provide ability to terminate any thread with enabled test features.

Signed-off-by: Andrey Gura <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/76297e2b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/76297e2b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/76297e2b

Branch: refs/heads/master
Commit: 76297e2b2ff92e294e7674a6e3e41b0d6a3b8b97
Parents: 88d5ff8
Author: Dmitriy Sorokin <[email protected]>
Authored: Thu May 24 16:03:41 2018 +0300
Committer: Andrey Gura <[email protected]>
Committed: Thu May 24 16:03:41 2018 +0300

----------------------------------------------------------------------
 .../ignite/internal/util/nio/GridNioServer.java |  2 +-
 .../worker/WorkersControlMXBeanImpl.java        | 29 ++++++
 .../ignite/mxbean/WorkersControlMXBean.java     | 30 ++++++
 .../testsuites/IgniteUtilSelfTestSuite.java     |  2 +
 .../util/mbeans/WorkersControlMXBeanTest.java   | 98 ++++++++++++++++++++
 5 files changed, 160 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/76297e2b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
index 3597a05..da3438e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
@@ -1790,7 +1790,7 @@ public class GridNioServer<T> {
                     if (err == null)
                         lsnr.onFailure(SYSTEM_WORKER_TERMINATION,
                             new IllegalStateException("Thread " + name() + " 
is terminated unexpectedly"));
-                    else if (err instanceof InterruptedException)
+                    else
                         lsnr.onFailure(SYSTEM_WORKER_TERMINATION, err);
                 }
                 else if (err != null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/76297e2b/modules/core/src/main/java/org/apache/ignite/internal/worker/WorkersControlMXBeanImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/worker/WorkersControlMXBeanImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/worker/WorkersControlMXBeanImpl.java
index 9e427e8..65f872c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/worker/WorkersControlMXBeanImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/worker/WorkersControlMXBeanImpl.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.worker;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import org.apache.ignite.internal.util.worker.GridWorker;
 import org.apache.ignite.mxbean.WorkersControlMXBean;
 
@@ -59,4 +60,32 @@ public class WorkersControlMXBeanImpl implements 
WorkersControlMXBean {
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public boolean stopThreadByUniqueName(String name) {
+        Thread[] threads = Thread.getAllStackTraces().keySet().stream()
+            .filter(t -> Objects.equals(t.getName(), name))
+            .toArray(Thread[]::new);
+
+        if (threads.length != 1)
+            return false;
+
+        threads[0].stop();
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean stopThreadById(long id) {
+        Thread[] threads = Thread.getAllStackTraces().keySet().stream()
+            .filter(t -> t.getId() == id)
+            .toArray(Thread[]::new);
+
+        if (threads.length != 1)
+            return false;
+
+        threads[0].stop();
+
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/76297e2b/modules/core/src/main/java/org/apache/ignite/mxbean/WorkersControlMXBean.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/mxbean/WorkersControlMXBean.java 
b/modules/core/src/main/java/org/apache/ignite/mxbean/WorkersControlMXBean.java
index 0f5419b..b999ab7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/mxbean/WorkersControlMXBean.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/mxbean/WorkersControlMXBean.java
@@ -46,4 +46,34 @@ public interface WorkersControlMXBean {
         "Name of worker to terminate."
     )
     public boolean terminateWorker(String name);
+
+    /**
+     * Stops thread by {@code name}, if exists and unique.
+     *
+     * @param name Thread name.
+     * @return {@code True} if thread has been stopped successfully, {@code 
false} otherwise.
+     */
+    @MXBeanDescription("Stops thread by unique name.")
+    @MXBeanParametersNames(
+        "name"
+    )
+    @MXBeanParametersDescriptions(
+        "Name of thread to stop."
+    )
+    public boolean stopThreadByUniqueName(String name);
+
+    /**
+     * Stops thread by {@code id}, if exists.
+     *
+     * @param id Thread id.
+     * @return {@code True} if thread has been stopped successfully, {@code 
false} otherwise.
+     */
+    @MXBeanDescription("Stops thread by id.")
+    @MXBeanParametersNames(
+        "id"
+    )
+    @MXBeanParametersDescriptions(
+        "Id of thread to stop."
+    )
+    public boolean stopThreadById(long id);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/76297e2b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
index 1243005..791621f 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
@@ -53,6 +53,7 @@ import 
org.apache.ignite.util.GridStringBuilderFactorySelfTest;
 import org.apache.ignite.util.mbeans.GridMBeanDisableSelfTest;
 import org.apache.ignite.util.mbeans.GridMBeanExoticNamesSelfTest;
 import org.apache.ignite.util.mbeans.GridMBeanSelfTest;
+import org.apache.ignite.util.mbeans.WorkersControlMXBeanTest;
 
 /**
  * Test suite for Ignite utility classes.
@@ -92,6 +93,7 @@ public class IgniteUtilSelfTestSuite extends TestSuite {
         suite.addTestSuite(GridCacheUtilsSelfTest.class);
         suite.addTestSuite(IgniteExceptionRegistrySelfTest.class);
         suite.addTestSuite(GridMessageCollectionTest.class);
+        suite.addTestSuite(WorkersControlMXBeanTest.class);
 
         // Metrics.
         suite.addTestSuite(ClusterMetricsSnapshotSerializeSelfTest.class);

http://git-wip-us.apache.org/repos/asf/ignite/blob/76297e2b/modules/core/src/test/java/org/apache/ignite/util/mbeans/WorkersControlMXBeanTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/util/mbeans/WorkersControlMXBeanTest.java
 
b/modules/core/src/test/java/org/apache/ignite/util/mbeans/WorkersControlMXBeanTest.java
new file mode 100644
index 0000000..c1c2fda
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/util/mbeans/WorkersControlMXBeanTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.util.mbeans;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import org.apache.ignite.internal.worker.WorkersControlMXBeanImpl;
+import org.apache.ignite.mxbean.WorkersControlMXBean;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * {@link WorkersControlMXBean} test.
+ */
+public class WorkersControlMXBeanTest extends GridCommonAbstractTest {
+    /** Test thread name. */
+    private static final String TEST_THREAD_NAME = "test-thread";
+
+    /**
+     * @throws Exception Thrown if test fails.
+     */
+    public void testStopThreadByUniqueName() throws Exception {
+        WorkersControlMXBean workersCtrlMXBean = new 
WorkersControlMXBeanImpl(null);
+
+        Thread t = startTestThread();
+
+        assertTrue(workersCtrlMXBean.stopThreadByUniqueName(TEST_THREAD_NAME));
+
+        t.join(500);
+
+        
assertFalse(workersCtrlMXBean.stopThreadByUniqueName(TEST_THREAD_NAME));
+
+        Thread t1 = startTestThread();
+        Thread t2 = startTestThread();
+
+        
assertFalse(workersCtrlMXBean.stopThreadByUniqueName(TEST_THREAD_NAME));
+
+        t1.stop();
+        t2.stop();
+    }
+
+    /**
+     * @throws Exception Thrown if test fails.
+     */
+    public void testStopThreadById() throws Exception {
+        WorkersControlMXBean workersCtrlMXBean = new 
WorkersControlMXBeanImpl(null);
+
+        Thread t1 = startTestThread();
+        Thread t2 = startTestThread();
+
+        assertTrue(workersCtrlMXBean.stopThreadById(t1.getId()));
+        assertTrue(workersCtrlMXBean.stopThreadById(t2.getId()));
+
+        t1.join(500);
+        t2.join(500);
+
+        assertFalse(workersCtrlMXBean.stopThreadById(t1.getId()));
+        assertFalse(workersCtrlMXBean.stopThreadById(t2.getId()));
+    }
+
+    /**
+     * @return Started thread.
+     */
+    private static Thread startTestThread() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Thread t = new Thread(TEST_THREAD_NAME) {
+            public void run() {
+                latch.countDown();
+
+                for (;;)
+                    ;
+            }
+        };
+
+        t.start();
+
+        assertTrue(latch.await(500, TimeUnit.MILLISECONDS));
+
+        assertTrue(t.isAlive());
+
+        return t;
+    }
+}

Reply via email to