This is an automated email from the ASF dual-hosted git repository.

bschuchardt pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new cf7ff85  GEODE-5142 new Thread Monitoring Mechanism
cf7ff85 is described below

commit cf7ff85112cc26d11dcbae48a498996a38e9dfea
Author: Bruce Schuchardt <[email protected]>
AuthorDate: Mon Oct 8 13:36:34 2018 -0700

    GEODE-5142 new Thread Monitoring Mechanism
    
    Fixing an NPE that may occur if a monitored thread disappears during
    expiry but before we've reported on its state.
---
 .../monitoring/executor/AbstractExecutor.java      | 45 ++++++++++++++--------
 .../monitoring/executor/PooledExecutorGroup.java   |  4 ++
 .../ThreadsMonitoringProcessJUnitTest.java         | 18 +++++++++
 3 files changed, 51 insertions(+), 16 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/AbstractExecutor.java
 
b/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/AbstractExecutor.java
index e303cda..6864e29 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/AbstractExecutor.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/AbstractExecutor.java
@@ -39,6 +39,12 @@ public abstract class AbstractExecutor {
     this.threadID = Thread.currentThread().getId();
   }
 
+  public AbstractExecutor(ThreadsMonitoring tMonitoring, long threadID) {
+    this.startTime = System.currentTimeMillis();
+    this.numIterationsStuck = 0;
+    this.threadID = threadID;
+  }
+
   public void handleExpiry(long stuckTime) {
     this.incNumIterationsStuck();
     logger.warn(handleLogMessage(stuckTime));
@@ -50,6 +56,7 @@ public abstract class AbstractExecutor {
 
     ThreadInfo thread =
         ManagementFactory.getThreadMXBean().getThreadInfo(this.threadID, 
THREAD_DUMP_DEPTH);
+    boolean logThreadDetails = (thread != null);
 
     StringBuilder strb = new StringBuilder();
 
@@ -57,26 +64,32 @@ public abstract class AbstractExecutor {
         .append(dateFormat.format(this.getStartTime())).append("> has been 
stuck for <")
         .append((float) stuckTime / 1000)
         .append(" seconds> and number of thread monitor iteration <")
-        .append(this.numIterationsStuck).append("> 
").append(System.lineSeparator())
-        .append("Thread Name <").append(thread.getThreadName()).append(">")
-        .append(System.lineSeparator()).append("Thread state 
<").append(thread.getThreadState())
-        .append(">").append(System.lineSeparator());
-
-    if (thread.getLockName() != null)
-      strb.append("Waiting on <").append(thread.getLockName()).append(">")
-          .append(System.lineSeparator());
+        .append(this.numIterationsStuck).append("> 
").append(System.lineSeparator());
+    if (logThreadDetails) {
+      strb.append("Thread Name <").append(thread.getThreadName()).append(">")
+          .append(System.lineSeparator()).append("Thread state 
<").append(thread.getThreadState())
+          .append(">").append(System.lineSeparator());
+
+      if (thread.getLockName() != null)
+        strb.append("Waiting on <").append(thread.getLockName()).append(">")
+            .append(System.lineSeparator());
+
+      if (thread.getLockOwnerName() != null)
+        strb.append("Owned By <").append(thread.getLockOwnerName()).append("> 
and ID <")
+            
.append(thread.getLockOwnerId()).append(">").append(System.lineSeparator());
+    }
 
-    if (thread.getLockOwnerName() != null)
-      strb.append("Owned By <").append(thread.getLockOwnerName()).append("> 
and ID <")
-          
.append(thread.getLockOwnerId()).append(">").append(System.lineSeparator());
 
     strb.append("Executor Group 
<").append(groupName).append(">").append(System.lineSeparator())
         .append("Monitored metric <ResourceManagerStats.numThreadsStuck>")
-        .append(System.lineSeparator()).append("Thread 
Stack:").append(System.lineSeparator());
-
-    for (int i = 0; i < thread.getStackTrace().length; i++) {
-      String row = thread.getStackTrace()[i].toString();
-      strb.append(row).append(System.lineSeparator());
+        .append(System.lineSeparator());
+
+    if (logThreadDetails) {
+      strb.append("Thread Stack:").append(System.lineSeparator());
+      for (int i = 0; i < thread.getStackTrace().length; i++) {
+        String row = thread.getStackTrace()[i].toString();
+        strb.append(row).append(System.lineSeparator());
+      }
     }
 
     return strb.toString();
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/PooledExecutorGroup.java
 
b/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/PooledExecutorGroup.java
index 4300c88..4ecacef 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/PooledExecutorGroup.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/monitoring/executor/PooledExecutorGroup.java
@@ -25,4 +25,8 @@ public class PooledExecutorGroup extends AbstractExecutor {
     setGroupName(GROUPNAME);
   }
 
+  public PooledExecutorGroup(ThreadsMonitoring tMonitoring, long threadID) {
+    super(tMonitoring, threadID);
+    setGroupName(GROUPNAME);
+  }
 }
diff --git 
a/geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringProcessJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringProcessJUnitTest.java
index 2fead00..a5e6563 100644
--- 
a/geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringProcessJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/internal/monitoring/ThreadsMonitoringProcessJUnitTest.java
@@ -63,6 +63,24 @@ public class ThreadsMonitoringProcessJUnitTest {
     threadsMonitoringImpl.close();
   }
 
+  @Test
+  public void monitorHandlesDefunctThread() {
+    final Properties nonDefault = new Properties();
+    final DistributionConfigImpl distributionConfigImpl = new 
DistributionConfigImpl(nonDefault);
+    final long threadID = Long.MAX_VALUE;
+
+    int timeLimit = distributionConfigImpl.getThreadMonitorTimeLimit();
+
+    AbstractExecutor absExtgroup = new 
PooledExecutorGroup(threadsMonitoringImpl, threadID);
+    absExtgroup.setStartTime(absExtgroup.getStartTime() - timeLimit - 1);
+
+    threadsMonitoringImpl.getMonitorMap().put(threadID, absExtgroup);
+
+    
assertTrue(threadsMonitoringImpl.getThreadsMonitoringProcess().mapValidation());
+
+    threadsMonitoringImpl.close();
+  }
+
   /**
    * Tests that indeed thread is NOT considered stuck when it shouldn't
    */

Reply via email to