Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@

import org.apache.geode.test.junit.runners.TestRunner;

/**
* Integration tests for {@link ExecutorServiceRule}. These are tests that pause a little longer
* than acceptable for a unit test.
*/
public class ExecutorServiceRuleIntegrationTest {

private static volatile CountDownLatch hangLatch;
Expand Down Expand Up @@ -69,8 +73,7 @@ public void awaitTermination() {
assertThat(result.wasSuccessful()).isTrue();

assertThat(isTestHung()).isTrue();
await()
.untilAsserted(() -> assertThat(executorService.isTerminated()).isTrue());
await().untilAsserted(() -> assertThat(executorService.isTerminated()).isTrue());
invocations.afterRule();

InOrder invocationOrder = inOrder(invocations);
Expand Down Expand Up @@ -117,6 +120,7 @@ public void doTest() {
}

interface Invocations {

void afterHangLatch();

void afterTerminateLatch();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,45 +272,44 @@ public long[] getThreadIds() {
}

/**
* Returns formatted call stacks of the {@code Thread}s that are directly in the
* {@code ExecutorService}'s {@code ThreadGroup} excluding subgroups.
* Returns thread dumps for the {@code Thread}s that are in the {@code ExecutorService}'s
* {@code ThreadGroup} excluding subgroups.
*/
public String dumpThreads() {
StringBuilder dump = new StringBuilder();
StringBuilder dumpWriter = new StringBuilder();

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(getThreadIds(), 100);
ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(getThreadIds(), true, true);

for (ThreadInfo threadInfo : threadInfos) {
dump.append('"');
dump.append(threadInfo.getThreadName());
dump.append("\" ");
final Thread.State state = threadInfo.getThreadState();
dump.append("\n java.lang.Thread.State: ");
dump.append(state);
final StackTraceElement[] stackTraceElements = threadInfo.getStackTrace();
for (final StackTraceElement stackTraceElement : stackTraceElements) {
dump.append("\n at ");
dump.append(stackTraceElement);
if (threadInfo == null) {
// sometimes ThreadMXBean.getThreadInfo returns array with one or more null elements
continue;
}
dump.append("\n\n");
// ThreadInfo toString includes monitor and synchronizer details
dumpWriter.append(threadInfo);
}
return dump.toString();

return dumpWriter.toString();
}

/**
* Modified version of {@code java.util.concurrent.Executors$DefaultThreadFactory} that uses
* a {@code Set<WeakReference<Thread>>} to track the {@code Thread}s in the factory's
* {@code ThreadGroup} excluding subgroups.
*/
static class DedicatedThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
protected static class DedicatedThreadFactory implements ThreadFactory {

private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);

private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
private final Set<WeakReference<Thread>> directThreads = new HashSet<>();

DedicatedThreadFactory() {
protected DedicatedThreadFactory() {
group = new ThreadGroup(ExecutorServiceRule.class.getSimpleName() + "-ThreadGroup");
namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";
namePrefix = "pool-" + POOL_NUMBER.getAndIncrement() + "-thread-";
}

@Override
Expand All @@ -326,7 +325,7 @@ public Thread newThread(Runnable r) {
return t;
}

Set<Thread> getThreads() {
protected Set<Thread> getThreads() {
Set<Thread> value = new HashSet<>();
for (WeakReference<Thread> reference : directThreads) {
Thread thread = reference.get();
Expand Down Expand Up @@ -375,7 +374,6 @@ public Builder useShutdown() {

/**
* Enables invocation of {@code shutdownNow} during {@code tearDown}. Default is enabled.
*
*/
public Builder useShutdownNow() {
useShutdown = false;
Expand Down
Loading