Skip to content
Merged
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 @@ -126,7 +126,7 @@ public void stopServer() {
@Test
public void testCloseAllThreadsWhenClosingSpanner() throws InterruptedException {
for (int i = 0; i < NUMBER_OF_TEST_RUNS; i++) {
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME), is(equalTo(0)));
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME, true), is(equalTo(0)));
// Create Spanner instance.
SpannerOptions options = createSpannerOptions();
Spanner spanner = options.getService();
Expand All @@ -145,7 +145,7 @@ public void testCloseAllThreadsWhenClosingSpanner() throws InterruptedException
// sessions should initialize multiple transport channels.
resultSets.add(rs);
// Check whether the number of expected threads has been reached.
if (getNumberOfThreadsWithName(SPANNER_THREAD_NAME)
if (getNumberOfThreadsWithName(SPANNER_THREAD_NAME, false)
== options.getNumChannels() * NUM_THREADS_PER_CHANNEL) {
break;
}
Expand Down Expand Up @@ -173,12 +173,12 @@ public void testCloseAllThreadsWhenClosingSpanner() throws InterruptedException
int totalWaits = 0;
while (true) {
Thread.sleep(100L);
if (getNumberOfThreadsWithName(SPANNER_THREAD_NAME) == 0 || totalWaits > 20) {
if (getNumberOfThreadsWithName(SPANNER_THREAD_NAME, false) == 0 || totalWaits > 20) {
break;
}
totalWaits++;
}
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME), is(equalTo(0)));
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME, true), is(equalTo(0)));
}
}

Expand All @@ -189,7 +189,7 @@ public void testCloseAllThreadsWhenClosingSpanner() throws InterruptedException
@Test
public void testMultipleOpenSpanners() throws InterruptedException {
List<Spanner> spanners = new ArrayList<>();
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME), is(equalTo(0)));
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME, true), is(equalTo(0)));
for (int openSpanners = 1; openSpanners <= 3; openSpanners++) {
// Create Spanner instance.
SpannerOptions options = createSpannerOptions();
Expand All @@ -203,7 +203,7 @@ public void testMultipleOpenSpanners() throws InterruptedException {
// to ensure we also hit multiple channels.
for (int sessionCount = 0;
sessionCount < options.getSessionPoolOptions().getMaxSessions()
&& getNumberOfThreadsWithName(SPANNER_THREAD_NAME)
&& getNumberOfThreadsWithName(SPANNER_THREAD_NAME, false)
< options.getNumChannels() * NUM_THREADS_PER_CHANNEL * openSpanners;
sessionCount++) {
ResultSet rs = client.singleUse().executeQuery(SELECT1AND2);
Expand All @@ -223,7 +223,7 @@ && getNumberOfThreadsWithName(SPANNER_THREAD_NAME)
}
// Wait a little to allow the threads to actually shutdown.
Thread.sleep(500L);
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME), is(equalTo(0)));
assertThat(getNumberOfThreadsWithName(SPANNER_THREAD_NAME, true), is(equalTo(0)));
}

@SuppressWarnings("rawtypes")
Expand All @@ -245,7 +245,7 @@ public ManagedChannelBuilder apply(ManagedChannelBuilder input) {
.build();
}

private int getNumberOfThreadsWithName(String serviceName) {
private int getNumberOfThreadsWithName(String serviceName, boolean dumpStack) {
Pattern pattern = Pattern.compile(String.format(THREAD_PATTERN, serviceName));
ThreadGroup group = Thread.currentThread().getThreadGroup();
while (group.getParent() != null) {
Expand All @@ -256,12 +256,32 @@ private int getNumberOfThreadsWithName(String serviceName) {
int res = 0;
for (int i = 0; i < numberOfThreads; i++) {
if (pattern.matcher(threads[i].getName()).matches()) {
if (dumpStack) {
dumpThread(threads[i]);
}
res++;
}
}
return res;
}

private void dumpThread(Thread thread) {
StringBuilder dump = new StringBuilder();
dump.append('"');
dump.append(thread.getName());
dump.append("\" ");
final Thread.State state = thread.getState();
dump.append("\n java.lang.Thread.State: ");
dump.append(state);
final StackTraceElement[] stackTraceElements = thread.getStackTrace();
for (final StackTraceElement stackTraceElement : stackTraceElements) {
dump.append("\n at ");
dump.append(stackTraceElement);
}
dump.append("\n\n");
System.out.print(dump.toString());
}

private void mockGetInstanceResponse() {
InstanceName name2 = InstanceName.of("[PROJECT]", "[INSTANCE]");
InstanceConfigName config = InstanceConfigName.of("[PROJECT]", "[INSTANCE_CONFIG]");
Expand Down