You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by as...@apache.org on 2015/12/23 00:51:35 UTC
[36/50] [abbrv] hadoop git commit: HDFS-9347. Invariant assumption in
TestQuorumJournalManager.shutdown() is wrong. Contributed by Wei-Chiu Chuang.
HDFS-9347. Invariant assumption in TestQuorumJournalManager.shutdown() is wrong. Contributed by Wei-Chiu Chuang.
Change-Id: Idde8522e11c77f82b376e0c90a9bf33d163d5cb9
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/ef3f3f6b
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/ef3f3f6b
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/ef3f3f6b
Branch: refs/heads/yarn-2877
Commit: ef3f3f6bb14cf44bef1778f1091d8ed8a4b764a3
Parents: 61ab044
Author: Zhe Zhang <zh...@apache.org>
Authored: Fri Dec 18 16:04:47 2015 -0800
Committer: Zhe Zhang <zh...@apache.org>
Committed: Fri Dec 18 16:04:47 2015 -0800
----------------------------------------------------------------------
.../apache/hadoop/test/GenericTestUtils.java | 54 ++++++++++++++++----
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++
.../client/TestQuorumJournalManager.java | 13 +++--
3 files changed, 56 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef3f3f6b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
index 02e9faa..9c14bb4 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java
@@ -418,25 +418,61 @@ public abstract class GenericTestUtils {
}
/**
+ * Determine if there are any threads whose name matches the regex.
+ * @param pattern a Pattern object used to match thread names
+ * @return true if there is any thread that matches the pattern
+ */
+ public static boolean anyThreadMatching(Pattern pattern) {
+ ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+
+ ThreadInfo[] infos =
+ threadBean.getThreadInfo(threadBean.getAllThreadIds(), 20);
+ for (ThreadInfo info : infos) {
+ if (info == null)
+ continue;
+ if (pattern.matcher(info.getThreadName()).matches()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Assert that there are no threads running whose name matches the
* given regular expression.
* @param regex the regex to match against
*/
public static void assertNoThreadsMatching(String regex) {
Pattern pattern = Pattern.compile(regex);
- ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
-
- ThreadInfo[] infos = threadBean.getThreadInfo(threadBean.getAllThreadIds(), 20);
- for (ThreadInfo info : infos) {
- if (info == null) continue;
- if (pattern.matcher(info.getThreadName()).matches()) {
- Assert.fail("Leaked thread: " + info + "\n" +
- Joiner.on("\n").join(info.getStackTrace()));
- }
+ if (anyThreadMatching(pattern)) {
+ Assert.fail("Leaked thread matches " + regex);
}
}
/**
+ * Periodically check and wait for any threads whose name match the
+ * given regular expression.
+ *
+ * @param regex the regex to match against.
+ * @param checkEveryMillis time (in milliseconds) between checks.
+ * @param waitForMillis total time (in milliseconds) to wait before throwing
+ * a time out exception.
+ * @throws TimeoutException
+ * @throws InterruptedException
+ */
+ public static void waitForThreadTermination(String regex,
+ int checkEveryMillis, final int waitForMillis) throws TimeoutException,
+ InterruptedException {
+ final Pattern pattern = Pattern.compile(regex);
+ waitFor(new Supplier<Boolean>() {
+ @Override public Boolean get() {
+ return !anyThreadMatching(pattern);
+ }
+ }, checkEveryMillis, waitForMillis);
+ }
+
+
+ /**
* Skip test if native build profile of Maven is not activated.
* Sub-project using this must set 'runningWithNative' property to true
* in the definition of native profile in pom.xml.
http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef3f3f6b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
index 2286203..920aab4 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
@@ -2532,6 +2532,9 @@ Release 2.8.0 - UNRELEASED
replicas should go through BlockPlacementPolicy
(J.Andreina via vinayakumarb)
+ HDFS-9347. Invariant assumption in TestQuorumJournalManager.shutdown()
+ is wrong. (Wei-Chiu Chuang via zhz)
+
Release 2.7.3 - UNRELEASED
INCOMPATIBLE CHANGES
http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef3f3f6b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java
index 3ba573c..7d770e0 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/client/TestQuorumJournalManager.java
@@ -38,6 +38,7 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeoutException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -103,21 +104,23 @@ public class TestQuorumJournalManager {
qjm.recoverUnfinalizedSegments();
assertEquals(1, qjm.getLoggerSetForTests().getEpoch());
}
-
+
@After
- public void shutdown() throws IOException {
+ public void shutdown() throws IOException, InterruptedException,
+ TimeoutException {
IOUtils.cleanup(LOG, toClose.toArray(new Closeable[0]));
-
+
// Should not leak clients between tests -- this can cause flaky tests.
// (See HDFS-4643)
- GenericTestUtils.assertNoThreadsMatching(".*IPC Client.*");
+ // Wait for IPC clients to terminate to avoid flaky tests
+ GenericTestUtils.waitForThreadTermination(".*IPC Client.*", 100, 1000);
if (cluster != null) {
cluster.shutdown();
cluster = null;
}
}
-
+
/**
* Enqueue a QJM for closing during shutdown. This makes the code a little
* easier to follow, with fewer try..finally clauses necessary.