You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by do...@apache.org on 2019/09/18 16:07:48 UTC
[spark] branch branch-2.4 updated: [SPARK-29104][CORE][TESTS] Fix
PipedRDDSuite to use `eventually` to check thread termination
This is an automated email from the ASF dual-hosted git repository.
dongjoon pushed a commit to branch branch-2.4
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-2.4 by this push:
new 00589bd [SPARK-29104][CORE][TESTS] Fix PipedRDDSuite to use `eventually` to check thread termination
00589bd is described below
commit 00589bd78f6ac16bbc8ae17b8ce9916c5a20b73a
Author: Dongjoon Hyun <dh...@apple.com>
AuthorDate: Tue Sep 17 20:21:25 2019 +0900
[SPARK-29104][CORE][TESTS] Fix PipedRDDSuite to use `eventually` to check thread termination
### What changes were proposed in this pull request?
`PipedRDD` will invoke `stdinWriterThread.interrupt()` at task completion, and `obj.wait` will get `InterruptedException`. However, there exists a possibility which the thread termination gets delayed because the thread starts from `obj.wait()` with that exception. To prevent test flakiness, we need to use `eventually`. Also, This PR fixes the typo in code comment and variable name.
### Why are the changes needed?
```
- stdin writer thread should be exited when task is finished *** FAILED ***
Some(Thread[stdin writer for List(cat),5,]) was not empty (PipedRDDSuite.scala:107)
```
- https://amplab.cs.berkeley.edu/jenkins/view/Spark%20QA%20Test%20(Dashboard)/job/spark-master-test-maven-hadoop-2.7/6867/testReport/junit/org.apache.spark.rdd/PipedRDDSuite/stdin_writer_thread_should_be_exited_when_task_is_finished/
### Does this PR introduce any user-facing change?
No.
### How was this patch tested?
Manual.
We can reproduce the same failure like Jenkins if we catch `InterruptedException` and sleep longer than the `eventually` timeout inside the test code. The following is the example to reproduce it.
```scala
val nums = sc.makeRDD(Array(1, 2, 3, 4), 1).map { x =>
try {
obj.synchronized {
obj.wait() // make the thread waits here.
}
} catch {
case ie: InterruptedException =>
Thread.sleep(15000)
throw ie
}
x
}
```
Closes #25808 from dongjoon-hyun/SPARK-29104.
Authored-by: Dongjoon Hyun <dh...@apple.com>
Signed-off-by: HyukjinKwon <gu...@apache.org>
(cherry picked from commit 34915b22ab174a45c563ccdcd5035299f3ccc56c)
Signed-off-by: Dongjoon Hyun <dh...@apple.com>
---
.../scala/org/apache/spark/rdd/PipedRDDSuite.scala | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/core/src/test/scala/org/apache/spark/rdd/PipedRDDSuite.scala b/core/src/test/scala/org/apache/spark/rdd/PipedRDDSuite.scala
index 69739a2..7d41957 100644
--- a/core/src/test/scala/org/apache/spark/rdd/PipedRDDSuite.scala
+++ b/core/src/test/scala/org/apache/spark/rdd/PipedRDDSuite.scala
@@ -21,16 +21,18 @@ import java.io.File
import scala.collection.JavaConverters._
import scala.collection.Map
+import scala.concurrent.duration._
import scala.io.Codec
import org.apache.hadoop.fs.Path
import org.apache.hadoop.io.{LongWritable, Text}
import org.apache.hadoop.mapred.{FileSplit, JobConf, TextInputFormat}
+import org.scalatest.concurrent.Eventually
import org.apache.spark._
import org.apache.spark.util.Utils
-class PipedRDDSuite extends SparkFunSuite with SharedSparkContext {
+class PipedRDDSuite extends SparkFunSuite with SharedSparkContext with Eventually {
val envCommand = if (Utils.isWindows) {
"cmd.exe /C set"
} else {
@@ -100,11 +102,16 @@ class PipedRDDSuite extends SparkFunSuite with SharedSparkContext {
assert(result.collect().length === 0)
- // collect stderr writer threads
- val stderrWriterThread = Thread.getAllStackTraces.keySet().asScala
- .find { _.getName.startsWith(PipedRDD.STDIN_WRITER_THREAD_PREFIX) }
-
- assert(stderrWriterThread.isEmpty)
+ // SPARK-29104 PipedRDD will invoke `stdinWriterThread.interrupt()` at task completion,
+ // and `obj.wait` will get InterruptedException. However, there exists a possibility
+ // which the thread termination gets delayed because the thread starts from `obj.wait()`
+ // with that exception. To prevent test flakiness, we need to use `eventually`.
+ eventually(timeout(10.seconds), interval(1.second)) {
+ // collect stdin writer threads
+ val stdinWriterThread = Thread.getAllStackTraces.keySet().asScala
+ .find { _.getName.startsWith(PipedRDD.STDIN_WRITER_THREAD_PREFIX) }
+ assert(stdinWriterThread.isEmpty)
+ }
}
test("advanced pipe") {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org