aboutsummaryrefslogtreecommitdiff
path: root/launcher/src
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/src')
-rw-r--r--launcher/src/main/java/org/apache/spark/launcher/ChildProcAppHandle.java17
-rw-r--r--launcher/src/main/java/org/apache/spark/launcher/SparkAppHandle.java3
2 files changed, 18 insertions, 2 deletions
diff --git a/launcher/src/main/java/org/apache/spark/launcher/ChildProcAppHandle.java b/launcher/src/main/java/org/apache/spark/launcher/ChildProcAppHandle.java
index de50f14fbd..1bfda289de 100644
--- a/launcher/src/main/java/org/apache/spark/launcher/ChildProcAppHandle.java
+++ b/launcher/src/main/java/org/apache/spark/launcher/ChildProcAppHandle.java
@@ -18,6 +18,7 @@
package org.apache.spark.launcher;
import java.io.IOException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadFactory;
@@ -102,8 +103,20 @@ class ChildProcAppHandle implements SparkAppHandle {
disconnect();
}
if (childProc != null) {
- childProc.destroy();
- childProc = null;
+ try {
+ childProc.exitValue();
+ } catch (IllegalThreadStateException e) {
+ // Child is still alive. Try to use Java 8's "destroyForcibly()" if available,
+ // fall back to the old API if it's not there.
+ try {
+ Method destroy = childProc.getClass().getMethod("destroyForcibly");
+ destroy.invoke(childProc);
+ } catch (Exception inner) {
+ childProc.destroy();
+ }
+ } finally {
+ childProc = null;
+ }
}
}
diff --git a/launcher/src/main/java/org/apache/spark/launcher/SparkAppHandle.java b/launcher/src/main/java/org/apache/spark/launcher/SparkAppHandle.java
index 13dd9f1739..e9caf0b3cb 100644
--- a/launcher/src/main/java/org/apache/spark/launcher/SparkAppHandle.java
+++ b/launcher/src/main/java/org/apache/spark/launcher/SparkAppHandle.java
@@ -89,6 +89,9 @@ public interface SparkAppHandle {
* Tries to kill the underlying application. Implies {@link #disconnect()}. This will not send
* a {@link #stop()} message to the application, so it's recommended that users first try to
* stop the application cleanly and only resort to this method if that fails.
+ * <p>
+ * Note that if the application is running as a child process, this method fail to kill the
+ * process when using Java 7. This may happen if, for example, the application is deadlocked.
*/
void kill();