From 4843c40c026096eab39d1cbb53570b46a6d139df Mon Sep 17 00:00:00 2001 From: CodingCat Date: Sun, 2 Aug 2015 15:57:01 -0400 Subject: [PATCH 01/13] sort alphabetically and change the css class name --- .../ui/exec/ExecutorThreadDumpPage.scala | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index b0a2cb4aa4d4b..6a7e9d800ac23 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -68,36 +68,35 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage "non-executor-thread" } } -
- - -
+ + {thread.threadId}{threadName}{thread.threadState} + +
{thread.stackTrace}
} -
-

Updated at {UIUtils.formatDate(time)}

- { - // scalastyle:off -

- Expand All -

-

- // scalastyle:on - } -
{dumpRows}
-
+
+

Updated at {UIUtils.formatDate(time)}

+ { + // scalastyle:off +

+ Expand All +

+

+ // scalastyle:on + } + + + + + + + {dumpRows} +
Thread IDThread NameThread State
+
}.getOrElse(Text("Error fetching thread dump")) UIUtils.headerSparkPage(s"Thread dump for executor $executorId", content, parent) } From 4ec95fa9fc949ef6a130064b2b679a26236f532c Mon Sep 17 00:00:00 2001 From: CodingCat Date: Tue, 4 Aug 2015 11:00:08 -0400 Subject: [PATCH 02/13] click column title to sort --- .../org/apache/spark/ui/static/sorttable.js | 6 ++--- .../org/apache/spark/ui/static/webui.css | 8 ------ .../ui/exec/ExecutorThreadDumpPage.scala | 25 ++++++++----------- 3 files changed, 14 insertions(+), 25 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/sorttable.js b/core/src/main/resources/org/apache/spark/ui/static/sorttable.js index dde6069000bc4..ecf99cc8091ea 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/sorttable.js +++ b/core/src/main/resources/org/apache/spark/ui/static/sorttable.js @@ -169,7 +169,7 @@ sorttable = { for (var i=0; i - val threadName = thread.threadName - val className = "accordion-heading " + { - if (threadName.contains("Executor task launch")) { - "executor-thread" - } else { - "non-executor-thread" - } - } - - {thread.threadId}{threadName}{thread.threadState} + val onClickEvent = s"$$('#${thread.threadId + "_stacktrace"}').toggleClass('hidden'); " + + s"$$('#stacktrace_column').toggleClass('hidden')" + + {thread.threadId}{thread.threadName}{thread.threadState} + +
{thread.stackTrace}
+ -
{thread.stackTrace}
}
@@ -79,20 +75,21 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage { // scalastyle:off

+ onClick="$('#stacktrace_column').removeClass('hidden'); $('.accordion-body').removeClass('hidden'); $('.expandbutton').toggleClass('hidden')"> Expand All

// scalastyle:on } - +
+ {dumpRows}
Thread ID Thread Name Thread State
From 64c470d7534ec10dbfdca2f123deaeebddcd82c4 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Tue, 4 Aug 2015 11:21:05 -0400 Subject: [PATCH 03/13] replace toggleClass with addClass --- .../scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index 3ac283ffedfac..84e85d27f66a7 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -61,7 +61,7 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage } }.map { thread => val onClickEvent = s"$$('#${thread.threadId + "_stacktrace"}').toggleClass('hidden'); " + - s"$$('#stacktrace_column').toggleClass('hidden')" + s"$$('#stacktrace_column').addClass('hidden')" {thread.threadId}{thread.threadName}{thread.threadState} From 26001aba888dd297dddd0f7ba80b1cd7a3a1acd0 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Tue, 4 Aug 2015 21:41:52 -0400 Subject: [PATCH 04/13] adjust the javascript functions --- .../org/apache/spark/ui/static/table.js | 35 +++++++++++++++++++ .../ui/exec/ExecutorThreadDumpPage.scala | 17 ++++----- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index 656147e40d13e..6e6e210fff7a5 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -30,3 +30,38 @@ function stripeSummaryTable() { } }); } + +function toggleThreadStackTrace(threadId) { + var threadCell = $("#" + threadId + "_stacktrace"); + var columnHeader = $('#stacktrace_column'); + var bindNum = parseInt(columnHeader.attr('bind')); + if (threadCell.hasClass('hidden')) { + // expand thread cell + columnHeader.attr("bind", bindNum + 1); + columnHeader.removeClass("hidden"); + threadCell.removeClass('hidden'); + } else { + // collapse thread cell + columnHeader.attr("bind", bindNum - 1); + if (bindNum - 1 == 0) { + columnHeader.addClass("hidden"); + } + threadCell.addClass('hidden'); + } +} + +// expandOrCollapse - true: expand, false: collapse +function expandOrCollapseAllThreadStackTrace(expandOrCollapse) { + var columnHeader = $('#stacktrace_column'); + if (expandOrCollapse) { + columnHeader.removeClass('hidden'); + $('.accordion-body').removeClass('hidden'); + columnHeader.attr("bind", $('.accordion-body').length); + $('.expandbutton').toggleClass('hidden') + } else { + columnHeader.addClass('hidden'); + $('.accordion-body').addClass('hidden'); + columnHeader.attr("bind", 0); + $('.expandbutton').toggleClass('hidden'); + } +} diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index 84e85d27f66a7..2b1de4b5d76a3 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -60,11 +60,10 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage } } }.map { thread => - val onClickEvent = s"$$('#${thread.threadId + "_stacktrace"}').toggleClass('hidden'); " + - s"$$('#stacktrace_column').addClass('hidden')" - - {thread.threadId}{thread.threadName}{thread.threadState} - + val threadId = thread.threadId + + {threadId}{thread.threadName}{thread.threadState} +
{thread.stackTrace}
@@ -74,12 +73,10 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage

Updated at {UIUtils.formatDate(time)}

{ // scalastyle:off -

+

Expand All

-

// scalastyle:on @@ -89,7 +86,7 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage Thread ID Thread Name Thread State - Thread Stacktrace + Thread Stacktrace {dumpRows} From 1b35ee93d6fbccabe5e77498b3707d3dfc3f815e Mon Sep 17 00:00:00 2001 From: CodingCat Date: Wed, 5 Aug 2015 11:28:23 -0400 Subject: [PATCH 05/13] added mouseover event --- core/src/main/resources/org/apache/spark/ui/static/table.js | 5 +++++ core/src/main/resources/org/apache/spark/ui/static/webui.css | 4 ++++ .../org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala | 5 ++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index 6e6e210fff7a5..fd9b915e2392a 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -65,3 +65,8 @@ function expandOrCollapseAllThreadStackTrace(expandOrCollapse) { $('.expandbutton').toggleClass('hidden'); } } + +// inOrOut - true: over, false: out +function onMouseOverAndOut(threadId) { + $("#" + threadId + "_tr").toggleClass("threaddump-td-mouseover"); +} diff --git a/core/src/main/resources/org/apache/spark/ui/static/webui.css b/core/src/main/resources/org/apache/spark/ui/static/webui.css index 28eff6edc5679..f25129ffa0ed4 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/webui.css +++ b/core/src/main/resources/org/apache/spark/ui/static/webui.css @@ -223,4 +223,8 @@ span.additional-metric-title { a.expandbutton { cursor: pointer; +} + +.threaddump-td-mouseover { + font-weight: bold; } \ No newline at end of file diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index 2b1de4b5d76a3..8af9231e81397 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -61,7 +61,10 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage } }.map { thread => val threadId = thread.threadId - + {threadId}{thread.threadName}{thread.threadState}
{thread.stackTrace}
From f2ff69dfa0f1c1145d97831164a26e171e0b0c41 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Wed, 5 Aug 2015 16:39:55 -0400 Subject: [PATCH 06/13] grep functionality --- .../org/apache/spark/ui/static/table.js | 22 ++++++++++++- .../ui/exec/ExecutorThreadDumpPage.scala | 33 ++++++++++++++++--- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index fd9b915e2392a..9ce97067044f4 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -68,5 +68,25 @@ function expandOrCollapseAllThreadStackTrace(expandOrCollapse) { // inOrOut - true: over, false: out function onMouseOverAndOut(threadId) { - $("#" + threadId + "_tr").toggleClass("threaddump-td-mouseover"); + $("#" + threadId + "_td_id").toggleClass("threaddump-td-mouseover"); + $("#" + threadId + "_td_name").toggleClass("threaddump-td-mouseover"); + $("#" + threadId + "_td_state").toggleClass("threaddump-td-mouseover"); +} + +function grep() { + var grepExp = $("#grepexp").val(); + if (grepExp != "") { + var url = location.href + if (url.indexOf("&grepexp=") == -1) { + location.href = url + "&grepexp=" + grepExp; + } else { + location.href = url.replace(/grep=(.*)&+/g, "grep=" + grepExp + "&"); + } + } else { + alert("input cannot be empty"); + } +} + +function viewAll() { + location.href = location.href.replace(/grep=(.*)&+/g, ""); } diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index 8af9231e81397..dc04867e11aef 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -48,7 +48,17 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage val time = System.currentTimeMillis() val maybeThreadDump = sc.get.getExecutorThreadDump(executorId) - val content = maybeThreadDump.map { threadDump => + val grepExp = Option(request.getParameter("grepexp")) + + val filteredContent = maybeThreadDump.map { threadDump => + threadDump.filter(thread => + if (!grepExp.isDefined) { + true + } else { + thread.stackTrace.filter(_ >= ' ').matches(grepExp.get) + } + ) + }.map { threadDump => val dumpRows = threadDump.sortWith { case (threadTrace1, threadTrace2) => { val v1 = if (threadTrace1.threadName.contains("Executor task launch")) 1 else 0 @@ -61,11 +71,13 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage } }.map { thread => val threadId = thread.threadId - - {threadId}{thread.threadName}{thread.threadState} + {threadId} + {thread.threadName} + {thread.threadState}
{thread.stackTrace}
@@ -82,6 +94,19 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage

+ + + + + + +
+ + + + + +
// scalastyle:on } @@ -95,6 +120,6 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage
}.getOrElse(Text("Error fetching thread dump")) - UIUtils.headerSparkPage(s"Thread dump for executor $executorId", content, parent) + UIUtils.headerSparkPage(s"Thread dump for executor $executorId", filteredContent, parent) } } From 8b8089e8ea96bc4ae6aa4b6e843c21585e963bad Mon Sep 17 00:00:00 2001 From: CodingCat Date: Wed, 5 Aug 2015 20:00:04 -0400 Subject: [PATCH 07/13] fix typos --- core/src/main/resources/org/apache/spark/ui/static/table.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index 9ce97067044f4..db9c3bba526b4 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -80,7 +80,7 @@ function grep() { if (url.indexOf("&grepexp=") == -1) { location.href = url + "&grepexp=" + grepExp; } else { - location.href = url.replace(/grep=(.*)&+/g, "grep=" + grepExp + "&"); + location.href = url.replace(/&grepexp=.*/g, "&grepexp=" + grepExp); } } else { alert("input cannot be empty"); @@ -88,5 +88,5 @@ function grep() { } function viewAll() { - location.href = location.href.replace(/grep=(.*)&+/g, ""); + location.href = location.href.replace(/&grepexp=(.*)/g, ""); } From 33bb3e3a8aa6a176beba9da43b07b6e6edf80798 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Thu, 6 Aug 2015 14:23:48 -0400 Subject: [PATCH 08/13] address Imran's comments and fix alignment issue --- .../ui/exec/ExecutorThreadDumpPage.scala | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index dc04867e11aef..ee7b360b42676 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -18,6 +18,7 @@ package org.apache.spark.ui.exec import java.net.URLDecoder +import java.util.regex.Pattern import javax.servlet.http.HttpServletRequest import scala.util.Try @@ -48,15 +49,11 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage val time = System.currentTimeMillis() val maybeThreadDump = sc.get.getExecutorThreadDump(executorId) - val grepExp = Option(request.getParameter("grepexp")) + val grepExp = Option(request.getParameter("grepexp")).map(Pattern.compile(_, Pattern.MULTILINE)) val filteredContent = maybeThreadDump.map { threadDump => threadDump.filter(thread => - if (!grepExp.isDefined) { - true - } else { - thread.stackTrace.filter(_ >= ' ').matches(grepExp.get) - } + grepExp.map { grep => grep.matcher(thread.stackTrace).find()}.getOrElse(true) ) }.map { threadDump => val dumpRows = threadDump.sortWith { @@ -94,19 +91,18 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage

- - - - - - -
- - - - - -
+
+
+
+
+ + + +
+
+
+
+

// scalastyle:on } From db7b54b58c25ef2c791a20f930a107f65f659e84 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Mon, 14 Sep 2015 20:21:55 -0400 Subject: [PATCH 09/13] search as you type in javascript --- .../org/apache/spark/ui/static/table.js | 29 ++++++++++--------- .../ui/exec/ExecutorThreadDumpPage.scala | 18 ++++-------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index db9c3bba526b4..f6dfd4773e3d0 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -73,20 +73,21 @@ function onMouseOverAndOut(threadId) { $("#" + threadId + "_td_state").toggleClass("threaddump-td-mouseover"); } -function grep() { - var grepExp = $("#grepexp").val(); - if (grepExp != "") { - var url = location.href - if (url.indexOf("&grepexp=") == -1) { - location.href = url + "&grepexp=" + grepExp; - } else { - location.href = url.replace(/&grepexp=.*/g, "&grepexp=" + grepExp); - } +function onSearchStringChange() { + var searchString = $('#search').val() + if (searchString.length == 0) { + $('tr').each(function() { + $(this).removeClass('hidden') + }) } else { - alert("input cannot be empty"); + $('tr').each(function(){ + if($(this).attr('id') && $(this).attr('id').match(/thread_[0-9]+_tr/) ) { + if ($(this).children().eq(3).text().toLowerCase().indexOf(searchString) >= 0) { + $(this).removeClass('hidden') + } else { + $(this).addClass('hidden') + } + } + }); } } - -function viewAll() { - location.href = location.href.replace(/&grepexp=(.*)/g, ""); -} diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index ee7b360b42676..f7c267b1a4215 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -49,14 +49,8 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage val time = System.currentTimeMillis() val maybeThreadDump = sc.get.getExecutorThreadDump(executorId) - val grepExp = Option(request.getParameter("grepexp")).map(Pattern.compile(_, Pattern.MULTILINE)) - - val filteredContent = maybeThreadDump.map { threadDump => - threadDump.filter(thread => - grepExp.map { grep => grep.matcher(thread.stackTrace).find()}.getOrElse(true) - ) - }.map { threadDump => - val dumpRows = threadDump.sortWith { + val content = maybeThreadDump.map { threadDump => + val dumpRows = threadDump.sortWith { case (threadTrace1, threadTrace2) => { val v1 = if (threadTrace1.threadName.contains("Executor task launch")) 1 else 0 val v2 = if (threadTrace2.threadName.contains("Executor task launch")) 1 else 0 @@ -68,7 +62,7 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage } }.map { thread => val threadId = thread.threadId - @@ -95,9 +89,7 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage
- - - + Search:
@@ -116,6 +108,6 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage
}.getOrElse(Text("Error fetching thread dump")) - UIUtils.headerSparkPage(s"Thread dump for executor $executorId", filteredContent, parent) + UIUtils.headerSparkPage(s"Thread dump for executor $executorId", content, parent) } } From c3dc9b7a1250998e2c7fa1817fac29ce74e1df66 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Thu, 22 Oct 2015 10:54:01 -0400 Subject: [PATCH 10/13] search over all columns and highlight background --- .../main/resources/org/apache/spark/ui/static/table.js | 9 ++++++++- .../main/resources/org/apache/spark/ui/static/webui.css | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index f6dfd4773e3d0..d1da124c38f61 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -82,7 +82,14 @@ function onSearchStringChange() { } else { $('tr').each(function(){ if($(this).attr('id') && $(this).attr('id').match(/thread_[0-9]+_tr/) ) { - if ($(this).children().eq(3).text().toLowerCase().indexOf(searchString) >= 0) { + var children = $(this).children() + var found = false + for (i = 0; i < children.length; i++) { + if (children.eq(i).text().toLowerCase().indexOf(searchString) >= 0) { + found = true + } + } + if (found) { $(this).removeClass('hidden') } else { $(this).addClass('hidden') diff --git a/core/src/main/resources/org/apache/spark/ui/static/webui.css b/core/src/main/resources/org/apache/spark/ui/static/webui.css index f25129ffa0ed4..fc38f8410bdf1 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/webui.css +++ b/core/src/main/resources/org/apache/spark/ui/static/webui.css @@ -226,5 +226,7 @@ a.expandbutton { } .threaddump-td-mouseover { - font-weight: bold; + background-color: #49535a !important; + color: white; + cursor:pointer; } \ No newline at end of file From e88f70d42088fd0767443b46b387381cd49342cb Mon Sep 17 00:00:00 2001 From: CodingCat Date: Thu, 22 Oct 2015 17:18:01 -0400 Subject: [PATCH 11/13] adjust the page structure, --- .../org/apache/spark/ui/static/table.js | 52 ++++++++++--------- .../ui/exec/ExecutorThreadDumpPage.scala | 17 +++--- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index d1da124c38f61..37fdbb756a62a 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -31,38 +31,40 @@ function stripeSummaryTable() { }); } -function toggleThreadStackTrace(threadId) { - var threadCell = $("#" + threadId + "_stacktrace"); - var columnHeader = $('#stacktrace_column'); - var bindNum = parseInt(columnHeader.attr('bind')); - if (threadCell.hasClass('hidden')) { - // expand thread cell - columnHeader.attr("bind", bindNum + 1); - columnHeader.removeClass("hidden"); - threadCell.removeClass('hidden'); +function toggleThreadStackTrace(threadId, forceAdd) { + var stackTrace = $("#" + threadId + "_stacktrace") + if (stackTrace.length == 0) { + var stackTraceText = $('#' + threadId + "_td_stacktrace").html() + var threadCell = $("#thread_" + threadId + "_tr") + threadCell.after("
" +
+            stackTraceText +  "
") } else { - // collapse thread cell - columnHeader.attr("bind", bindNum - 1); - if (bindNum - 1 == 0) { - columnHeader.addClass("hidden"); + if (!forceAdd) { + stackTrace.remove() } - threadCell.addClass('hidden'); } } // expandOrCollapse - true: expand, false: collapse -function expandOrCollapseAllThreadStackTrace(expandOrCollapse) { - var columnHeader = $('#stacktrace_column'); +function expandOrCollapseAllThreadStackTrace(expandOrCollapse, toggleButton) { if (expandOrCollapse) { - columnHeader.removeClass('hidden'); - $('.accordion-body').removeClass('hidden'); - columnHeader.attr("bind", $('.accordion-body').length); - $('.expandbutton').toggleClass('hidden') + $('.accordion-heading').each(function() { + //get thread ID + if (!$(this).hasClass("hidden")) { + var trId = $(this).attr('id').match(/thread_([0-9]+)_tr/m)[1] + toggleThreadStackTrace(trId, true) + } + }) + if (toggleButton) { + $('.expandbutton').toggleClass('hidden') + } } else { - columnHeader.addClass('hidden'); - $('.accordion-body').addClass('hidden'); - columnHeader.attr("bind", 0); - $('.expandbutton').toggleClass('hidden'); + $('.accordion-body').each(function() { + $(this).remove() + }) + if (toggleButton) { + $('.expandbutton').toggleClass('hidden'); + } } } @@ -75,6 +77,8 @@ function onMouseOverAndOut(threadId) { function onSearchStringChange() { var searchString = $('#search').val() + //remove the stacktrace + expandOrCollapseAllThreadStackTrace(false, false) if (searchString.length == 0) { $('tr').each(function() { $(this).removeClass('hidden') diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index f7c267b1a4215..47db0700a8267 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -63,15 +63,13 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage }.map { thread => val threadId = thread.threadId {threadId} {thread.threadName} {thread.threadState} - -
{thread.stackTrace}
- + {thread.stackTrace} } @@ -79,10 +77,10 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage

Updated at {UIUtils.formatDate(time)}

{ // scalastyle:off -

+

Expand All

-

@@ -99,10 +97,9 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage } - - - - + + + {dumpRows}
Thread IDThread NameThread StateThread IDThread NameThread State
From 8bfb4bceb5cd4d2201283cadd7d1f0e9e9f59c40 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Sun, 1 Nov 2015 18:31:21 -0500 Subject: [PATCH 12/13] separate expand and collapse function --- .../org/apache/spark/ui/static/table.js | 42 +++++++++---------- .../ui/exec/ExecutorThreadDumpPage.scala | 13 +++--- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index 37fdbb756a62a..511fe36127c63 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -45,29 +45,29 @@ function toggleThreadStackTrace(threadId, forceAdd) { } } -// expandOrCollapse - true: expand, false: collapse -function expandOrCollapseAllThreadStackTrace(expandOrCollapse, toggleButton) { - if (expandOrCollapse) { - $('.accordion-heading').each(function() { - //get thread ID - if (!$(this).hasClass("hidden")) { - var trId = $(this).attr('id').match(/thread_([0-9]+)_tr/m)[1] - toggleThreadStackTrace(trId, true) - } - }) - if (toggleButton) { - $('.expandbutton').toggleClass('hidden') - } - } else { - $('.accordion-body').each(function() { - $(this).remove() - }) - if (toggleButton) { - $('.expandbutton').toggleClass('hidden'); +function expandAllThreadStackTrace(toggleButton) { + $('.accordion-heading').each(function() { + //get thread ID + if (!$(this).hasClass("hidden")) { + var trId = $(this).attr('id').match(/thread_([0-9]+)_tr/m)[1] + toggleThreadStackTrace(trId, true) } + }) + if (toggleButton) { + $('.expandbutton').toggleClass('hidden') } } +function collapseAllThreadStackTrace(toggleButton) { + $('.accordion-body').each(function() { + $(this).remove() + }) + if (toggleButton) { + $('.expandbutton').toggleClass('hidden'); + } +} + + // inOrOut - true: over, false: out function onMouseOverAndOut(threadId) { $("#" + threadId + "_td_id").toggleClass("threaddump-td-mouseover"); @@ -76,9 +76,9 @@ function onMouseOverAndOut(threadId) { } function onSearchStringChange() { - var searchString = $('#search').val() + var searchString = $('#search').val().toLowerCase(); //remove the stacktrace - expandOrCollapseAllThreadStackTrace(false, false) + collapseAllThreadStackTrace(false, false) if (searchString.length == 0) { $('tr').each(function() { $(this).removeClass('hidden') diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala index 47db0700a8267..58575d154ce5c 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala @@ -18,7 +18,6 @@ package org.apache.spark.ui.exec import java.net.URLDecoder -import java.util.regex.Pattern import javax.servlet.http.HttpServletRequest import scala.util.Try @@ -50,7 +49,7 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage val maybeThreadDump = sc.get.getExecutorThreadDump(executorId) val content = maybeThreadDump.map { threadDump => - val dumpRows = threadDump.sortWith { + val dumpRows = threadDump.sortWith { case (threadTrace1, threadTrace2) => { val v1 = if (threadTrace1.threadName.contains("Executor task launch")) 1 else 0 val v2 = if (threadTrace2.threadName.contains("Executor task launch")) 1 else 0 @@ -77,10 +76,10 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage

Updated at {UIUtils.formatDate(time)}

{ // scalastyle:off -

+

Expand All

-

@@ -97,9 +96,9 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage } - - - + + + {dumpRows}
Thread IDThread NameThread StateThread IDThread NameThread State
From 6106c7fb343be6e66714f8d8cd9fa96b098aa782 Mon Sep 17 00:00:00 2001 From: CodingCat Date: Mon, 2 Nov 2015 20:33:21 -0500 Subject: [PATCH 13/13] collapseAllThreadStackTrace takes only one parameter --- core/src/main/resources/org/apache/spark/ui/static/table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/org/apache/spark/ui/static/table.js b/core/src/main/resources/org/apache/spark/ui/static/table.js index 511fe36127c63..14b06bfe860ed 100644 --- a/core/src/main/resources/org/apache/spark/ui/static/table.js +++ b/core/src/main/resources/org/apache/spark/ui/static/table.js @@ -78,7 +78,7 @@ function onMouseOverAndOut(threadId) { function onSearchStringChange() { var searchString = $('#search').val().toLowerCase(); //remove the stacktrace - collapseAllThreadStackTrace(false, false) + collapseAllThreadStackTrace(false) if (searchString.length == 0) { $('tr').each(function() { $(this).removeClass('hidden')