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