You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/02/14 13:11:26 UTC
[07/34] ignite git commit: IGNITE-2539 issues reproduce test
IGNITE-2539 issues reproduce test
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6485ae58
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6485ae58
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6485ae58
Branch: refs/heads/ignite-3727-2
Commit: 6485ae58c1f6dafdbfcf4de4f258f1386affa723
Parents: 784958b
Author: DmitriyGovorukhin <dg...@gridgain.com>
Authored: Thu Sep 8 14:55:09 2016 +0300
Committer: DmitriyGovorukhin <dg...@gridgain.com>
Committed: Thu Sep 8 14:55:09 2016 +0300
----------------------------------------------------------------------
.../ignite/internal/util/IgniteUtils.java | 41 ++++
.../IssuesIGNITE2539ReproduceTest.java | 227 +++++++++++++++++++
2 files changed, 268 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/6485ae58/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index e3389d5..9fd4122 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -1244,6 +1244,47 @@ public abstract class IgniteUtils {
}
/**
+ * Performs thread dump and return all available info.
+ */
+ public static GridStringBuilder dumpThreads() {
+ ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
+
+ GridStringBuilder sb = new GridStringBuilder("Thread dump at ")
+ .a(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z").format(new Date(U.currentTimeMillis()))).a(NL);
+
+ final Set<Long> deadlockedThreadsIds = getDeadlockedThreadIds(mxBean);
+
+ sb.a(NL);
+
+ if (deadlockedThreadsIds.isEmpty())
+ sb.a("No deadlocked threads detected.");
+ else
+ sb.a("Deadlocked threads detected (see thread dump below) " +
+ "[deadlockedThreadsCnt=" + deadlockedThreadsIds.size() + ']');
+
+ sb.a(NL);
+
+ ThreadInfo[] threadInfos =
+ mxBean.dumpAllThreads(mxBean.isObjectMonitorUsageSupported(), mxBean.isSynchronizerUsageSupported());
+
+ for (ThreadInfo info : threadInfos) {
+ printThreadInfo(info, sb, deadlockedThreadsIds);
+
+ sb.a(NL);
+
+ if (info.getLockedSynchronizers() != null && info.getLockedSynchronizers().length > 0) {
+ printSynchronizersInfo(info.getLockedSynchronizers(), sb);
+
+ sb.a(NL);
+ }
+ }
+
+ sb.a(NL);
+
+ return sb;
+ }
+
+ /**
* Get deadlocks from the thread bean.
* @param mxBean the bean
* @return the set of deadlocked threads (may be empty Set, but never null).
http://git-wip-us.apache.org/repos/asf/ignite/blob/6485ae58/modules/core/src/test/java/org/apache/ignite/cache/affinity/bugreproduce/IssuesIGNITE2539ReproduceTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/cache/affinity/bugreproduce/IssuesIGNITE2539ReproduceTest.java b/modules/core/src/test/java/org/apache/ignite/cache/affinity/bugreproduce/IssuesIGNITE2539ReproduceTest.java
new file mode 100644
index 0000000..c39ebf0
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/cache/affinity/bugreproduce/IssuesIGNITE2539ReproduceTest.java
@@ -0,0 +1,227 @@
+package org.apache.ignite.cache.affinity.bugreproduce;
+
+import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.affinity.*;
+import org.apache.ignite.cache.affinity.rendezvous.*;
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.internal.util.*;
+import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
+import org.apache.ignite.testframework.*;
+import org.apache.ignite.testframework.junits.common.*;
+
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.*;
+
+/**
+ * Created by dgovorukhin on 01.09.2016.
+ */
+public class IssuesIGNITE2539ReproduceTest extends GridCommonAbstractTest {
+ /** */
+ protected static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+ /** */
+ private static final int ITERATIONS = 10;
+
+ /** partitioned cache name. */
+ private static final String CACHE_NAME_DHT_PARTITIONED = "cacheP";
+
+ /** replicated cache name. */
+ private static final String CACHE_NAME_DHT_REPLICATED = "cacheR";
+
+ /** Ignite. */
+ private static Ignite ignite1;
+
+ /** Ignite. */
+ private static Ignite ignite2;
+
+ /** Ignite. */
+ private static Ignite ignite3;
+
+ private static final AtomicReference<Throwable> exc = new AtomicReference<>();
+
+ private static final AtomicReference<GridStringBuilder> dump = new AtomicReference<>();
+
+ private static final AtomicReference<Thread> thr = new AtomicReference<>();
+
+ /**
+ * @return Affinity function to test.
+ */
+ private AffinityFunction affinityFunction() {
+ return new RendezvousAffinityFunction();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ ignite1 = startGrid(0);
+ ignite2 = startGrid(1);
+ ignite3 = startGrid(2);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ stopAllGrids();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+ IgniteConfiguration iCfg = super.getConfiguration(gridName);
+
+ ((TcpDiscoverySpi)iCfg.getDiscoverySpi()).setIpFinder(ipFinder);
+ iCfg.setRebalanceThreadPoolSize(2);
+
+ return iCfg;
+ }
+
+ /**
+ *
+ */
+ public void testCacheStopping() throws Exception {
+
+ final int delta = 5;
+
+ for (Thread worker : getExchangeWorkerThread()) {
+ worker.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+ @Override public void uncaughtException(Thread t, Throwable e) {
+ dump.compareAndSet(null, U.dumpThreads());
+ exc.compareAndSet(null, e);
+ thr.compareAndSet(null, t);
+ }
+ });
+ }
+
+ GridTestUtils.runAsync(new Callable<Void>() {
+ @Override public Void call() throws Exception {
+
+ for (int start = 0; Ignition.allGrids().contains(ignite1); start += delta) {
+ fillWithCache(ignite2, delta, start, affinityFunction());
+
+ for (String victim : ignite2.cacheNames())
+ ignite2.getOrCreateCache(victim).put(start, delta);
+
+ for (String victim : ignite1.cacheNames())
+ ignite1.destroyCache(victim);
+ }
+ return null;
+ }
+ }, "CacheSerialKiller");
+
+ for (int i = delta; i < ITERATIONS + delta; i++)
+ startGrid(i);
+
+ U.sleep(500);
+
+ for (int i = delta; i < ITERATIONS + delta; i++)
+ stopGrid(i);
+
+ if (exc.get() != null) {
+ log.info(thr.get().getName());
+
+ Throwable e = exc.get();
+ log.error(e.getMessage(), e);
+
+ log.info(dump.toString());
+
+ exc.set(null);
+ dump.set(null);
+ thr.set(null);
+
+ fail("see all log");
+ }
+ }
+
+ /**
+ *
+ */
+ public void testCacheStopping2() throws Exception {
+
+ final int delta = 5;
+
+ int itr = 20;
+
+ for (int j = 0; j < itr; j++) {
+
+ AtomicReference<Throwable> exc = new AtomicReference<>();
+
+ AtomicBoolean asyncRun = new AtomicBoolean(true);
+
+ for (Thread worker : getExchangeWorkerThread()) {
+ worker.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+ @Override public void uncaughtException(Thread t, Throwable e) {
+ exc.set(e);
+ }
+ });
+ }
+
+ Thread thread = new Thread(new Runnable() {
+ @Override public void run() {
+ for (int start = 0; asyncRun.get(); start += delta) {
+ fillWithCache(ignite2, delta, start, affinityFunction());
+
+ for (String victim : ignite2.cacheNames())
+ ignite2.getOrCreateCache(victim).put(start, delta);
+
+ for (String victim : ignite1.cacheNames())
+ ignite1.destroyCache(victim);
+ }
+ }
+ });
+ thread.start();
+
+ for (int i = delta; i < ITERATIONS + delta; i++)
+ startGrid(i);
+
+ U.sleep(500);
+
+ for (int i = delta; i < ITERATIONS + delta; i++)
+ stopGrid(i);
+
+ asyncRun.set(false);
+
+ thread.join();
+
+ if (exc.get() != null)
+ fail(exc.get().getMessage());
+
+ }
+ }
+
+ /**
+ *
+ */
+ private Iterable<Thread> getExchangeWorkerThread() {
+ Collection<Thread> exhcWorkers = new ArrayList<>();
+ for (Thread t : Thread.getAllStackTraces().keySet()) {
+ if (t.getName().contains("exchange-worker"))
+ exhcWorkers.add(t);
+ }
+ return exhcWorkers;
+ }
+
+ /** Put 2 * {@code iterations} caches inside ignite. */
+ private static void fillWithCache(Ignite ignite, int iterations, int start, AffinityFunction affinityFunction) {
+ for (int i = start; i < iterations + start; i++) {
+ CacheConfiguration<Integer, Integer> cachePCfg = new CacheConfiguration<>();
+
+ cachePCfg.setName(CACHE_NAME_DHT_PARTITIONED + i);
+ cachePCfg.setCacheMode(CacheMode.PARTITIONED);
+ cachePCfg.setBackups(1);
+ cachePCfg.setAffinity(affinityFunction);
+
+ ignite.getOrCreateCache(cachePCfg);
+
+ CacheConfiguration<Integer, Integer> cacheRCfg = new CacheConfiguration<>();
+
+ cacheRCfg.setName(CACHE_NAME_DHT_REPLICATED + i);
+ cacheRCfg.setCacheMode(CacheMode.REPLICATED);
+ cachePCfg.setBackups(0);
+ cachePCfg.setAffinity(affinityFunction);
+
+ ignite.getOrCreateCache(cacheRCfg);
+ }
+ }
+}