]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
PR30377: fix debuginfod -r -X combination
authorFrank Ch. Eigler <fche@redhat.com>
Fri, 21 Apr 2023 21:04:08 +0000 (17:04 -0400)
committerFrank Ch. Eigler <fche@redhat.com>
Sun, 23 Apr 2023 01:12:16 +0000 (21:12 -0400)
Until this fix, debuginfod -r -X '.*' didn't trigger groom-time removal
of everything, because the -I include regex overrode it.  Corrected logic
to match the scan-time tie-breaking between -I / -X.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
debuginfod/ChangeLog
debuginfod/debuginfod.cxx
doc/debuginfod.8
tests/ChangeLog
tests/Makefile.am
tests/run-debuginfod-IXr.sh [new file with mode: 0755]

index 070dad03fba1e1ec58a61a3bfc3a38df3ed5828d..0e4810bba5014c0545fdaa180c577012efb5729c 100644 (file)
@@ -1,3 +1,7 @@
+2023-04-21  Frank Ch. Eigler <fche@redhat.com>
+
+       * debuginfod.cxx (groom): Fix -r / -X logic.
+
 2023-04-13  Frank Ch. Eigler <fche@redhat.com>
 
        * debuginfod.cxx (archive_classify, scan_archive_file): Catch and
index e981d137223387b46576ac6420429ec67b71f8fd..a1ddeb569a363de058c05d9bc04cdb5bb871de16 100644 (file)
@@ -3893,7 +3893,7 @@ void groom()
         {
           bool reg_include = !regexec (&file_include_regex, filename, 0, 0, 0);
           bool reg_exclude = !regexec (&file_exclude_regex, filename, 0, 0, 0);
-          regex_file_drop = reg_exclude && !reg_include;
+          regex_file_drop = !reg_include || reg_exclude; // match logic of scan_source_paths  
         }
 
       rc = stat(filename, &s);
index 07cb01aeed106be0d4efd95e65c24239f284eacf..5358aaba42c9d747f3c08504b48a36fb1f63ff1d 100644 (file)
@@ -172,7 +172,10 @@ interrupting a groom pass (if any).
 
 .TP
 .B "\-r"
-Apply the -I and -X during groom cycles, so that files excluded by the regexes are removed from the index. These parameters are in addition to what normally qualifies a file for grooming, not a replacement.
+Apply the -I and -X during groom cycles, so that most content related
+to files excluded by the regexes are removed from the index.  Not all
+content can be practically removed, so eventually a "\-G"
+"maximal-groom" operation may be needed.
 
 .TP
 .B "\-g SECONDS" "\-\-groom\-time=SECONDS"
index eb3e1118fa00767da12a94747c5de92c791546cc..d816873ce083165b50daf4ec0b7e08de65dd7428 100644 (file)
@@ -1,3 +1,8 @@
+2023-04-21  Frank Ch. Eigler <fche@redhat.com>
+
+       * run-debuginfod-IXr.sh: New test.
+       * Makefile.am: Run it, ship it.
+
 2023-02-10  Mark Wielaard  <mark@klomp.org>
 
        * varlocs.c (print_expr): Handle DW_OP_GNU_uninit.
index 7e32f1170c1bfd7543e303f7ea7d987bd3cad397..0ca8aa9e7e81644daea4c993269863c3af3e91bc 100644 (file)
@@ -261,7 +261,8 @@ TESTS += run-debuginfod-dlopen.sh \
          run-debuginfod-response-headers.sh \
          run-debuginfod-extraction-passive.sh \
         run-debuginfod-webapi-concurrency.sh \
-        run-debuginfod-section.sh
+        run-debuginfod-section.sh \
+        run-debuginfod-IXr.sh
 endif
 if !OLD_LIBMICROHTTPD
 # Will crash on too old libmicrohttpd
@@ -578,6 +579,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
              run-debuginfod-extraction-passive.sh \
              run-debuginfod-webapi-concurrency.sh \
             run-debuginfod-section.sh \
+            run-debuginfod-IXr.sh \
             debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm \
             debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm \
             debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm \
diff --git a/tests/run-debuginfod-IXr.sh b/tests/run-debuginfod-IXr.sh
new file mode 100755 (executable)
index 0000000..631b7bb
--- /dev/null
@@ -0,0 +1,94 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2023 Red Hat, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+mkdir R Z
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=10100
+get_ports
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+cp -rvp ${abs_srcdir}/debuginfod-rpms R
+
+if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
+    rm -vrf R/debuginfod-rpms/fedora31
+    rpms=0
+    tarxz=1
+    groomed=2
+else
+    rpms=6
+    tarxz=1
+    groomed=8
+fi
+
+cp -rvp ${abs_srcdir}/debuginfod-tars Z
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d $DB -X 'hello2' -I 'hello' -R -Z .tar.xz -Z .tar.bz2=bzcat -p $PORT1 -t0 -g0 -v R Z > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+# Confirm that the hello3 files are excluded
+
+wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
+wait_ready $PORT1 'scanned_files_total{source=".tar.xz archive"}' $tarxz
+
+
+kill $PID1
+wait $PID1
+PID1=0
+
+# Start second debuginfod, with exclusion of everything
+
+echo 'RERUN WITH -r and -X everything' >> vlog$PORT1
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d $DB -r -X '.*' -F -R -Z .tar.xz -Z .tar.bz2=bzcat -p $PORT1 -t0 -g0 -v R Z >> vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+
+wait_ready $PORT1 'thread_work_total{role="groom"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+wait_ready $PORT1 'groomed_total{decision="stale"}' $groomed
+wait_ready $PORT1 'groom{statistic="files scanned (#)"}' 0
+
+kill $PID1
+wait $PID1
+PID1=0
+
+exit 0