From dfe1f7ff30f4e0be538835fca1e6348723ea7aa7 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Fri, 16 Aug 2024 11:54:20 -0700 Subject: [PATCH] find-debuginfo.sh: Exit with real exit status in parallel jobs Currently, when the script is executed in parallel (-jN), the resulting exit status will always be 0. The script execs an appropriate number of clones of itself, calling run_job to run the actual workload. This then calls do_file(), saving the exit status into "res.$jobid". In do_file(), though, if an error occurs, exit is called. This causes the entire exec'd shell to exit with status 0 (since there are almost always echo calls as the last executed statement). The real exit status is therefor never written to the "res.$jobid" files by run_job(). The simple solution is to use 'return' instead of 'exit'. A number of minor adjustments are also made to propagate this properly so that it is reported as the correct exit status. While at it, I've incorporated a patch for find-debuginfo/30505. Using this patch and another patch to the RPM package (submitted as github issue #3215), failures of gdb-add-index.sh will now properly fail the build instead of being swallowed. It should be much easier for developers to figure out why their builds have failed should gdb crash. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30505 Signed-off-by: Keith Seitz --- scripts/find-debuginfo.in | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/scripts/find-debuginfo.in b/scripts/find-debuginfo.in index ae0818f..5998b9d 100755 --- a/scripts/find-debuginfo.in +++ b/scripts/find-debuginfo.in @@ -477,16 +477,20 @@ do_file() -l "$SOURCEFILE" "$f") || exit if [ -z "$id" ]; then echo >&2 "*** ${strict_error}: No build ID note found in $f" - $strict && exit 2 + $strict && return 2 fi # Add .gdb_index if requested. if $include_gdb_index; then if type gdb-add-index >/dev/null 2>&1; then - gdb-add-index "$f" + gdb-add-index "$f" || { + status=$? + echo >&2 "*** ERROR:: GDB exited with exit status $status during index generation" + return 2 + } else echo >&2 "*** ERROR: GDB index requested, but no gdb-add-index installed" - exit 2 + return 2 fi fi @@ -547,6 +551,7 @@ run_job() { local jobid=$1 filenum local SOURCEFILE=$temp/debugsources.$jobid ELFBINSFILE=$temp/elfbins.$jobid + local res=0 >"$SOURCEFILE" >"$ELFBINSFILE" @@ -558,8 +563,12 @@ run_job() break fi do_file $(sed -n "$(( 0x$filenum )) p" "$temp/primary") + res=$? + if [ $res != 0 ]; then + break + fi done - echo 0 >"$temp/res.$jobid" + echo $res >"$temp/res.$jobid" } n_files=$(wc -l <"$temp/primary") @@ -570,6 +579,10 @@ fi if [ $n_jobs -le 1 ]; then while read nlinks inum f; do do_file "$nlinks" "$inum" "$f" + res=$? + if [ "$res" != "0" ]; then + exit $res + fi done <"$temp/primary" else for ((i = 1; i <= n_files; i++)); do @@ -587,7 +600,7 @@ else test -f "$f" || continue res=$(< "$f") if [ "$res" != "0" ]; then - exit 1 + exit $res fi done # List of sources may have lots of duplicates. A kernel build was seen -- 2.33.0