Github user vanzin commented on a diff in the pull request:
https://github.com/apache/spark/pull/20474#discussion_r165733278
--- Diff:
core/src/main/scala/org/apache/spark/status/api/v1/OneApplicationResource.scala
---
@@ -51,6 +52,43 @@ private[v1] class AbstractApplicationResource extends
BaseAppResource {
@Path("executors")
def executorList(): Seq[ExecutorSummary] =
withUI(_.store.executorList(true))
+ @GET
+ @Path("executors/{executorId}/threads")
+ def threadDump(@PathParam("executorId") executorId: String): Response =
withUI { ui =>
+ uiRoot.executorThreadDumpsNotAvailableError().getOrElse {
+ val safeExecutorId =
+ Option(UIUtils.stripXSS(executorId)).map { executorId =>
+ UIUtils.decodeURLParameter(executorId)
+ }.getOrElse {
+ throw new IllegalArgumentException(s"Missing executorId
parameter")
+ }
+
+ def isAllDigits(x: String) = x.forall(Character.isDigit)
+
+ if (executorId != SparkContext.DRIVER_IDENTIFIER &&
!isAllDigits(executorId)) {
+ Response.serverError()
+ .entity(s"Invalid executorId: neither
'${SparkContext.DRIVER_IDENTIFIER}' nor number.")
+ .status(Response.Status.BAD_REQUEST)
+ .build()
+ } else {
+ if
(ui.store.asOption(ui.store.executorSummary(executorId)).exists(!_.isActive)) {
--- End diff --
Since that method doesn't throw an exception, perhaps it's not worth it to
try to fix this race nor make the log change.
Also I think the logic here is a little off. If the executor doesn't exist
at all in the store, this condition will not trigger.
```
scala> case class Exec(active: Boolean)
scala> Option[Exec](null).exists(!_.active)
res3: Boolean = false
```
In that situation you should probably return a 404 error (= throw
NotFoundException).
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]