aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorLiang-Chi Hsieh <viirya@gmail.com>2014-12-18 21:41:02 -0800
committerJosh Rosen <joshrosen@databricks.com>2014-12-18 21:41:02 -0800
commitd7fc69a8b5c92b2bbb71f95027e5283968cd0679 (patch)
tree0624b05d9ee0cb0a2fd6f024b03ef3a4fc44a9c7 /core
parentee1fb97a97d5ac18cd2ad8028e84ecbd988fb811 (diff)
downloadspark-d7fc69a8b5c92b2bbb71f95027e5283968cd0679.tar.gz
spark-d7fc69a8b5c92b2bbb71f95027e5283968cd0679.tar.bz2
spark-d7fc69a8b5c92b2bbb71f95027e5283968cd0679.zip
[SPARK-4674] Refactor getCallSite
The current version of `getCallSite` visits the collection of `StackTraceElement` twice. However, it is unnecessary since we can perform our work with a single visit. We also do not need to keep filtered `StackTraceElement`. Author: Liang-Chi Hsieh <viirya@gmail.com> Closes #3532 from viirya/refactor_getCallSite and squashes the following commits: 62aa124 [Liang-Chi Hsieh] Fix style. e741017 [Liang-Chi Hsieh] Refactor getCallSite.
Diffstat (limited to 'core')
-rw-r--r--core/src/main/scala/org/apache/spark/util/Utils.scala44
1 files changed, 22 insertions, 22 deletions
diff --git a/core/src/main/scala/org/apache/spark/util/Utils.scala b/core/src/main/scala/org/apache/spark/util/Utils.scala
index 9c04e45a58..d16233a0bc 100644
--- a/core/src/main/scala/org/apache/spark/util/Utils.scala
+++ b/core/src/main/scala/org/apache/spark/util/Utils.scala
@@ -1024,13 +1024,6 @@ private[spark] object Utils extends Logging {
* @param skipClass Function that is used to exclude non-user-code classes.
*/
def getCallSite(skipClass: String => Boolean = coreExclusionFunction): CallSite = {
- val trace = Thread.currentThread.getStackTrace().filterNot { ste: StackTraceElement =>
- // When running under some profilers, the current stack trace might contain some bogus
- // frames. This is intended to ensure that we don't crash in these situations by
- // ignoring any frames that we can't examine.
- ste == null || ste.getMethodName == null || ste.getMethodName.contains("getStackTrace")
- }
-
// Keep crawling up the stack trace until we find the first function not inside of the spark
// package. We track the last (shallowest) contiguous Spark method. This might be an RDD
// transformation, a SparkContext function (such as parallelize), or anything else that leads
@@ -1040,27 +1033,34 @@ private[spark] object Utils extends Logging {
var firstUserLine = 0
var insideSpark = true
var callStack = new ArrayBuffer[String]() :+ "<unknown>"
-
- for (el <- trace) {
- if (insideSpark) {
- if (skipClass(el.getClassName)) {
- lastSparkMethod = if (el.getMethodName == "<init>") {
- // Spark method is a constructor; get its class name
- el.getClassName.substring(el.getClassName.lastIndexOf('.') + 1)
+
+ Thread.currentThread.getStackTrace().foreach { ste: StackTraceElement =>
+ // When running under some profilers, the current stack trace might contain some bogus
+ // frames. This is intended to ensure that we don't crash in these situations by
+ // ignoring any frames that we can't examine.
+ if (ste != null && ste.getMethodName != null
+ && !ste.getMethodName.contains("getStackTrace")) {
+ if (insideSpark) {
+ if (skipClass(ste.getClassName)) {
+ lastSparkMethod = if (ste.getMethodName == "<init>") {
+ // Spark method is a constructor; get its class name
+ ste.getClassName.substring(ste.getClassName.lastIndexOf('.') + 1)
+ } else {
+ ste.getMethodName
+ }
+ callStack(0) = ste.toString // Put last Spark method on top of the stack trace.
} else {
- el.getMethodName
+ firstUserLine = ste.getLineNumber
+ firstUserFile = ste.getFileName
+ callStack += ste.toString
+ insideSpark = false
}
- callStack(0) = el.toString // Put last Spark method on top of the stack trace.
} else {
- firstUserLine = el.getLineNumber
- firstUserFile = el.getFileName
- callStack += el.toString
- insideSpark = false
+ callStack += ste.toString
}
- } else {
- callStack += el.toString
}
}
+
val callStackDepth = System.getProperty("spark.callstack.depth", "20").toInt
CallSite(
shortForm = s"$lastSparkMethod at $firstUserFile:$firstUserLine",