3.9 KiB
3.9 KiB
UNDF: UNDF-2026-000000290
spark-deeper — Scheduler + Catalyst + Physical Plan + Storage + Shuffle CLEAN
Areas Scanned
Core Scheduler
core/src/main/scala/org/apache/spark/scheduler/DAGScheduler.scala— BFS traversals (spark-0002), waitingStages filter (spark-0004),submitWaitingChildStages,stageDependsOn,getMissingParentStages, all 6 BFS methods — all already covered by existing defectscore/src/main/scala/org/apache/spark/scheduler/TaskSchedulerImpl.scala— allcontains/existscalls useHashMap/mutable.Map→ O(1)core/src/main/scala/org/apache/spark/scheduler/TaskSetManager.scala— no List.contains in hot pathscore/src/main/scala/org/apache/spark/scheduler/TaskSetExcludeList.scala—excludedExecs,excludedNodesareHashSet→ O(1)core/src/main/scala/org/apache/spark/scheduler/HealthTracker.scala— cleancore/src/main/scala/org/apache/spark/scheduler/LiveListenerBus.scala—queues.asScala.find(_.name == queue)on bounded small list (typically 4 queues)
Catalyst Optimizer
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala—excludeListisAttributeSet(O(1)),projectList.exists(...)is O(E) but called once per plan node, not in a nested loopsql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala— allprojectList.exists()/aggList.exists()calls are O(E) single-pass pattern-match guardssql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2Commands.scala—assignments.exists(isEqual(_, fieldPath))is O(A×F) infilterSchema, but this is a schema-time operation on small datasql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/CapturesConfig.scala—configPrefixDenyListhas ~11 fixed entries, not a scaling concern
Physical Plan Operators
sql/core/src/main/scala/org/apache/spark/sql/execution/joins/— allcontains/existscalls useHashSet,OpenHashSet,AttributeSet, orExpressionSet→ O(1)sql/core/src/main/scala/org/apache/spark/sql/execution/exchange/EnsureRequirements.scala—childrenIndexesis bounded (≤ 2 for joins)sql/core/src/main/scala/org/apache/spark/sql/execution/adaptive/— cleansql/core/src/main/scala/org/apache/spark/sql/execution/aggregate/—modes.contains(Final)etc. is on a small fixed-size list
Dynamic Partition Pruning (Spark SQL)
sql/core/src/main/scala/org/apache/spark/sql/execution/dynamicpruning/PartitionPruning.scala—joinKeys.indexOf(filteringKeys.head)is O(K) single call, not in a loop
Storage and Shuffle
core/src/main/scala/org/apache/spark/storage/— no list.contains patterns in hot pathscore/src/main/scala/org/apache/spark/shuffle/— no list.contains patterns in hot paths
RDD Operations
core/src/main/scala/org/apache/spark/rdd/RDD.scala—getNarrowAncestorsusesmutable.HashSet→ O(1)core/src/main/scala/org/apache/spark/rdd/OrderedRDDFunctions.scala—partitionIndices.containsuses ScalaRange.contains→ O(1)core/src/main/scala/org/apache/spark/rdd/CoalescedRDD.scala— allcontainscalls useHashMap-backed structures
MLlib (spot check)
mllib/src/main/scala/org/apache/spark/ml/feature/RFormulaParser.scala—dotTerms.containsis O(D) per filter call on plan-time formula parsing — negligible at runtime
Verdict: No new CWE-407 defects found beyond spark-0001 through spark-0004
All identified contains/exists/find calls in hot paths either:
- Operate on hash-based structures (O(1) lookup), or
- Are called once per plan node / RDD construction (not in a doubly-nested loop), or
- Operate on bounded-size data (≤ join side count, ≤ mode count, etc.)
The 6 BFS ListBuffer.remove(0) defects are already captured as spark-0002.
The submitWaitingChildStages O(W×P) defect is already captured as spark-0004.