PR30377: debuginfod -r -X

Message ID ZEL/W/RlTAPsOH2H@elastic.org
State Committed
Headers
Series PR30377: debuginfod -r -X |

Commit Message

Frank Ch. Eigler April 21, 2023, 9:25 p.m. UTC
  Hi -

Planning to push this one-liner fix shortly.
A new test case exercises the -r / -I / -X ops.


commit bc6c774dfb61ac61a66195a269579544f97eeb30
Author: Frank Ch. Eigler <fche@redhat.com>
Date:   Fri Apr 21 17:04:08 2023 -0400

    PR30377: fix debuginfod -r -X combination
    
    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>
  

Patch

diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog
index 070dad03fba1..0e4810bba501 100644
--- a/debuginfod/ChangeLog
+++ b/debuginfod/ChangeLog
@@ -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
diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx
index e981d1372233..a1ddeb569a36 100644
--- a/debuginfod/debuginfod.cxx
+++ b/debuginfod/debuginfod.cxx
@@ -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);
diff --git a/doc/debuginfod.8 b/doc/debuginfod.8
index 07cb01aeed10..5358aaba42c9 100644
--- a/doc/debuginfod.8
+++ b/doc/debuginfod.8
@@ -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"
diff --git a/tests/ChangeLog b/tests/ChangeLog
index eb3e1118fa00..d816873ce083 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -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.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7e32f1170c1b..0ca8aa9e7e81 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 000000000000..631b7bbfbfd2
--- /dev/null
+++ b/tests/run-debuginfod-IXr.sh
@@ -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