@@ -24,15 +24,17 @@ import scala.collection.mutable.{ArrayBuffer, SynchronizedBuffer}
24
24
import org .apache .spark .Logging
25
25
26
26
/** Asynchronously passes SparkListenerEvents to registered SparkListeners. */
27
- private [spark] class SparkListenerBus () extends Logging {
28
- private val sparkListeners = new ArrayBuffer [SparkListener ]() with SynchronizedBuffer [SparkListener ]
27
+ private [spark] class SparkListenerBus extends Logging {
28
+ private val sparkListeners = new ArrayBuffer [SparkListener ] with SynchronizedBuffer [SparkListener ]
29
29
30
30
/* Cap the capacity of the SparkListenerEvent queue so we get an explicit error (rather than
31
31
* an OOM exception) if it's perpetually being added to more quickly than it's being drained. */
32
- private val EVENT_QUEUE_CAPACITY = 10000
32
+ private val EVENT_QUEUE_CAPACITY = 10000
33
33
private val eventQueue = new LinkedBlockingQueue [SparkListenerEvents ](EVENT_QUEUE_CAPACITY )
34
34
private var queueFullErrorMessageLogged = false
35
35
36
+ // Create a new daemon thread to listen for events. This thread is stopped when it receives
37
+ // a SparkListenerShutdown event, using the stop method.
36
38
new Thread (" SparkListenerBus" ) {
37
39
setDaemon(true )
38
40
override def run () {
@@ -53,6 +55,9 @@ private[spark] class SparkListenerBus() extends Logging {
53
55
sparkListeners.foreach(_.onTaskGettingResult(taskGettingResult))
54
56
case taskEnd : SparkListenerTaskEnd =>
55
57
sparkListeners.foreach(_.onTaskEnd(taskEnd))
58
+ case SparkListenerShutdown =>
59
+ // Get out of the while loop and shutdown the daemon thread
60
+ return
56
61
case _ =>
57
62
}
58
63
}
@@ -80,7 +85,7 @@ private[spark] class SparkListenerBus() extends Logging {
80
85
*/
81
86
def waitUntilEmpty (timeoutMillis : Int ): Boolean = {
82
87
val finishTime = System .currentTimeMillis + timeoutMillis
83
- while (! eventQueue.isEmpty() ) {
88
+ while (! eventQueue.isEmpty) {
84
89
if (System .currentTimeMillis > finishTime) {
85
90
return false
86
91
}
@@ -90,4 +95,6 @@ private[spark] class SparkListenerBus() extends Logging {
90
95
}
91
96
return true
92
97
}
98
+
99
+ def stop (): Unit = post(SparkListenerShutdown )
93
100
}
0 commit comments