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
*/