aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcelo Vanzin <vanzin@cloudera.com>2016-05-10 10:34:26 -0700
committerMarcelo Vanzin <vanzin@cloudera.com>2016-05-10 10:34:26 -0700
commit36c5892b4631d1d5d70e569fce12efedd82bdef0 (patch)
tree7afca5421e06765bd454c2a8f3490e8c4e3e3d86
parent488863d87340e0fb68e81ba0be6df7d7c9723992 (diff)
downloadspark-36c5892b4631d1d5d70e569fce12efedd82bdef0.tar.gz
spark-36c5892b4631d1d5d70e569fce12efedd82bdef0.tar.bz2
spark-36c5892b4631d1d5d70e569fce12efedd82bdef0.zip
[SPARK-13670][LAUNCHER] Propagate error from launcher to shell.
bash doesn't really propagate errors from subshells when using redirection the way spark-class does; so, instead, this change captures the exit code of the launcher process in the command array, and checks it before executing the actual command. Tested by injecting an error in Main.java (the launcher entry point) and verifying the shell gets the right exit code from spark-class. Author: Marcelo Vanzin <vanzin@cloudera.com> Closes #12910 from vanzin/SPARK-13670.
-rwxr-xr-xbin/spark-class19
1 files changed, 18 insertions, 1 deletions
diff --git a/bin/spark-class b/bin/spark-class
index b2a36b9846..23a60c6ee4 100755
--- a/bin/spark-class
+++ b/bin/spark-class
@@ -64,8 +64,25 @@ fi
# The launcher library will print arguments separated by a NULL character, to allow arguments with
# characters that would be otherwise interpreted by the shell. Read that in a while loop, populating
# an array that will be used to exec the final command.
+#
+# The exit code of the launcher is appended to the output, so the parent shell removes it from the
+# command array and checks the value to see if the launcher succeeded.
+build_command() {
+ "$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@"
+ printf "%d\0" $?
+}
+
CMD=()
while IFS= read -d '' -r ARG; do
CMD+=("$ARG")
-done < <("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@")
+done < <(build_command "$@")
+
+COUNT=${#CMD[@]}
+LAST=$((COUNT - 1))
+LAUNCHER_EXIT_CODE=${CMD[$LAST]}
+if [ $LAUNCHER_EXIT_CODE != 0 ]; then
+ exit $LAUNCHER_EXIT_CODE
+fi
+
+CMD=("${CMD[@]:0:$LAST}")
exec "${CMD[@]}"