@@ -24,7 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger
24
24
25
25
import scala .annotation .tailrec
26
26
import scala .collection .Map
27
- import scala .collection .mutable .{ArrayStack , HashMap , HashSet }
27
+ import scala .collection .mutable .{HashMap , HashSet , ListBuffer }
28
28
import scala .concurrent .duration ._
29
29
import scala .util .control .NonFatal
30
30
@@ -468,21 +468,21 @@ private[spark] class DAGScheduler(
468
468
469
469
/** Find ancestor shuffle dependencies that are not registered in shuffleToMapStage yet */
470
470
private def getMissingAncestorShuffleDependencies (
471
- rdd : RDD [_]): ArrayStack [ShuffleDependency [_, _, _]] = {
472
- val ancestors = new ArrayStack [ShuffleDependency [_, _, _]]
471
+ rdd : RDD [_]): ListBuffer [ShuffleDependency [_, _, _]] = {
472
+ val ancestors = new ListBuffer [ShuffleDependency [_, _, _]]
473
473
val visited = new HashSet [RDD [_]]
474
474
// We are manually maintaining a stack here to prevent StackOverflowError
475
475
// caused by recursively visiting
476
- val waitingForVisit = new ArrayStack [RDD [_]]
477
- waitingForVisit.push( rdd)
476
+ val waitingForVisit = new ListBuffer [RDD [_]]
477
+ waitingForVisit += rdd
478
478
while (waitingForVisit.nonEmpty) {
479
- val toVisit = waitingForVisit.pop( )
479
+ val toVisit = waitingForVisit.remove( 0 )
480
480
if (! visited(toVisit)) {
481
481
visited += toVisit
482
482
getShuffleDependencies(toVisit).foreach { shuffleDep =>
483
483
if (! shuffleIdToMapStage.contains(shuffleDep.shuffleId)) {
484
- ancestors.push (shuffleDep)
485
- waitingForVisit.push (shuffleDep.rdd)
484
+ ancestors.prepend (shuffleDep)
485
+ waitingForVisit.prepend (shuffleDep.rdd)
486
486
} // Otherwise, the dependency and its ancestors have already been registered.
487
487
}
488
488
}
@@ -506,17 +506,17 @@ private[spark] class DAGScheduler(
506
506
rdd : RDD [_]): HashSet [ShuffleDependency [_, _, _]] = {
507
507
val parents = new HashSet [ShuffleDependency [_, _, _]]
508
508
val visited = new HashSet [RDD [_]]
509
- val waitingForVisit = new ArrayStack [RDD [_]]
510
- waitingForVisit.push( rdd)
509
+ val waitingForVisit = new ListBuffer [RDD [_]]
510
+ waitingForVisit += rdd
511
511
while (waitingForVisit.nonEmpty) {
512
- val toVisit = waitingForVisit.pop( )
512
+ val toVisit = waitingForVisit.remove( 0 )
513
513
if (! visited(toVisit)) {
514
514
visited += toVisit
515
515
toVisit.dependencies.foreach {
516
516
case shuffleDep : ShuffleDependency [_, _, _] =>
517
517
parents += shuffleDep
518
518
case dependency =>
519
- waitingForVisit.push (dependency.rdd)
519
+ waitingForVisit.prepend (dependency.rdd)
520
520
}
521
521
}
522
522
}
@@ -529,10 +529,10 @@ private[spark] class DAGScheduler(
529
529
*/
530
530
private def traverseParentRDDsWithinStage (rdd : RDD [_], predicate : RDD [_] => Boolean ): Boolean = {
531
531
val visited = new HashSet [RDD [_]]
532
- val waitingForVisit = new ArrayStack [RDD [_]]
533
- waitingForVisit.push( rdd)
532
+ val waitingForVisit = new ListBuffer [RDD [_]]
533
+ waitingForVisit += rdd
534
534
while (waitingForVisit.nonEmpty) {
535
- val toVisit = waitingForVisit.pop( )
535
+ val toVisit = waitingForVisit.remove( 0 )
536
536
if (! visited(toVisit)) {
537
537
if (! predicate(toVisit)) {
538
538
return false
@@ -542,7 +542,7 @@ private[spark] class DAGScheduler(
542
542
case _ : ShuffleDependency [_, _, _] =>
543
543
// Not within the same stage with current rdd, do nothing.
544
544
case dependency =>
545
- waitingForVisit.push (dependency.rdd)
545
+ waitingForVisit.prepend (dependency.rdd)
546
546
}
547
547
}
548
548
}
@@ -554,7 +554,8 @@ private[spark] class DAGScheduler(
554
554
val visited = new HashSet [RDD [_]]
555
555
// We are manually maintaining a stack here to prevent StackOverflowError
556
556
// caused by recursively visiting
557
- val waitingForVisit = new ArrayStack [RDD [_]]
557
+ val waitingForVisit = new ListBuffer [RDD [_]]
558
+ waitingForVisit += stage.rdd
558
559
def visit (rdd : RDD [_]) {
559
560
if (! visited(rdd)) {
560
561
visited += rdd
@@ -568,15 +569,14 @@ private[spark] class DAGScheduler(
568
569
missing += mapStage
569
570
}
570
571
case narrowDep : NarrowDependency [_] =>
571
- waitingForVisit.push (narrowDep.rdd)
572
+ waitingForVisit.prepend (narrowDep.rdd)
572
573
}
573
574
}
574
575
}
575
576
}
576
577
}
577
- waitingForVisit.push(stage.rdd)
578
578
while (waitingForVisit.nonEmpty) {
579
- visit(waitingForVisit.pop( ))
579
+ visit(waitingForVisit.remove( 0 ))
580
580
}
581
581
missing.toList
582
582
}
@@ -2000,7 +2000,8 @@ private[spark] class DAGScheduler(
2000
2000
val visitedRdds = new HashSet [RDD [_]]
2001
2001
// We are manually maintaining a stack here to prevent StackOverflowError
2002
2002
// caused by recursively visiting
2003
- val waitingForVisit = new ArrayStack [RDD [_]]
2003
+ val waitingForVisit = new ListBuffer [RDD [_]]
2004
+ waitingForVisit += stage.rdd
2004
2005
def visit (rdd : RDD [_]) {
2005
2006
if (! visitedRdds(rdd)) {
2006
2007
visitedRdds += rdd
@@ -2009,17 +2010,16 @@ private[spark] class DAGScheduler(
2009
2010
case shufDep : ShuffleDependency [_, _, _] =>
2010
2011
val mapStage = getOrCreateShuffleMapStage(shufDep, stage.firstJobId)
2011
2012
if (! mapStage.isAvailable) {
2012
- waitingForVisit.push (mapStage.rdd)
2013
+ waitingForVisit.prepend (mapStage.rdd)
2013
2014
} // Otherwise there's no need to follow the dependency back
2014
2015
case narrowDep : NarrowDependency [_] =>
2015
- waitingForVisit.push (narrowDep.rdd)
2016
+ waitingForVisit.prepend (narrowDep.rdd)
2016
2017
}
2017
2018
}
2018
2019
}
2019
2020
}
2020
- waitingForVisit.push(stage.rdd)
2021
2021
while (waitingForVisit.nonEmpty) {
2022
- visit(waitingForVisit.pop( ))
2022
+ visit(waitingForVisit.remove( 0 ))
2023
2023
}
2024
2024
visitedRdds.contains(target.rdd)
2025
2025
}
0 commit comments