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 2016/12/05 14:42:04 UTC

[42/50] [abbrv] ignite git commit: debugging TC hangs

debugging TC hangs


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

Branch: refs/heads/ignite-comm-balance-master
Commit: 6414b3f45dd61350e5c3cfab1be886cf779c9118
Parents: 9fea9f8
Author: Yakov Zhdanov <yz...@gridgain.com>
Authored: Wed Nov 30 17:43:35 2016 +0700
Committer: Yakov Zhdanov <yz...@gridgain.com>
Committed: Wed Nov 30 17:43:35 2016 +0700

----------------------------------------------------------------------
 .../ignite/internal/util/IgniteUtils.java       | 22 +++++++++++++++++-
 .../ignite/internal/util/StripedExecutor.java   | 24 ++++++++++++++++----
 2 files changed, 40 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/6414b3f4/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 5db7964..aefcbb5 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
@@ -149,7 +149,6 @@ import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteInterruptedException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.IgniteSystemProperties;
-import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryRawReader;
 import org.apache.ignite.binary.BinaryRawWriter;
 import org.apache.ignite.cluster.ClusterGroupEmptyException;
@@ -1297,6 +1296,27 @@ public abstract class IgniteUtils {
     }
 
     /**
+     * @param threadId Thread ID.
+     * @param sb Builder.
+     */
+    public static void printStackTrace(long threadId, GridStringBuilder sb) {
+        ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
+
+        ThreadInfo threadInfo = mxBean.getThreadInfo(threadId);
+
+        printThreadInfo(threadInfo, sb, Collections.<Long>emptySet());
+    }
+
+    /**
+     * @return {@code true} if there is java level deadlock.
+     */
+    public static boolean deadlockPresent() {
+        ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
+
+        return !F.isEmpty(mxBean.findDeadlockedThreads());
+    }
+
+    /**
      * Prints single thread info to a buffer.
      *
      * @param threadInfo Thread info.

http://git-wip-us.apache.org/repos/asf/ignite/blob/6414b3f4/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
index df70ae9..189d64e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
@@ -51,7 +51,7 @@ public class StripedExecutor implements ExecutorService {
      *
      * @param cnt Count.
      */
-    public StripedExecutor(int cnt, String gridName, String poolName, IgniteLogger log) {
+    public StripedExecutor(int cnt, String gridName, String poolName, final IgniteLogger log) {
         boolean success = false;
 
         stripes = new Stripe[cnt];
@@ -72,16 +72,30 @@ public class StripedExecutor implements ExecutorService {
                 @Override public void run() {
                     for (; !isShutdown();) {
                         try {
-                            Thread.sleep(10000);
+                            Thread.sleep(10_000);
                         }
                         catch (InterruptedException e) {
                             return;
                         }
 
                         for (Stripe stripe : stripes) {
-                            if (stripe.queueSize() > 0)
-                                System.out.println(">>> Possible starvation in striped pool: " +
-                                    stripe.thread.getName() + " - " + stripe.queueToString());
+                            if (stripe.queueSize() > 0) {
+                                boolean deadlockPresent = U.deadlockPresent();
+
+                                GridStringBuilder sb = new GridStringBuilder();
+
+                                sb.a(">>> Possible starvation in striped pool: ")
+                                    .a(stripe.thread.getName()).a(U.nl())
+                                    .a(stripe.queueToString()).a(U.nl())
+                                    .a("deadlock: ").a(deadlockPresent).a(U.nl());
+
+                                U.printStackTrace(stripe.thread.getId(), sb);
+
+                                String msg = sb.toString();
+
+                                U.warn(log, msg);
+                                U.warn(null, msg);
+                            }
                         }
                     }
                 }