diff options
author | Marcelo Vanzin <vanzin@cloudera.com> | 2016-05-10 10:34:26 -0700 |
---|---|---|
committer | Marcelo Vanzin <vanzin@cloudera.com> | 2016-05-10 10:34:26 -0700 |
commit | 36c5892b4631d1d5d70e569fce12efedd82bdef0 (patch) | |
tree | 7afca5421e06765bd454c2a8f3490e8c4e3e3d86 | |
parent | 488863d87340e0fb68e81ba0be6df7d7c9723992 (diff) | |
download | spark-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-x | bin/spark-class | 19 |
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[@]}" |