debugedit/backport-find-debuginfo.sh-Exit-with-real-exit-status-in-para.patch

108 lines
3.3 KiB
Diff
Raw Normal View History

2024-12-12 14:39:18 +08:00
From dfe1f7ff30f4e0be538835fca1e6348723ea7aa7 Mon Sep 17 00:00:00 2001
From: Keith Seitz <keiths@redhat.com>
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 <keiths@redhat.com>
---
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