]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
PR28577: Make run-debuginfod-fd-prefetch-caches.sh test something
authorNoah Sanci <nsanci@redhat.com>
Fri, 13 May 2022 18:32:27 +0000 (14:32 -0400)
committerMark Wielaard <mark@klomp.org>
Fri, 3 Jun 2022 16:21:54 +0000 (18:21 +0200)
Update to the run-debuginfod-fd-prefetch to make the test more
sound.

Signed-off-by: Mark Wielaard <mark@klomp.org>
tests/ChangeLog
tests/run-debuginfod-fd-prefetch-caches.sh

index fb95692537affb4d850f3145727dd8717931db3a..6ea8e792e11da079dc978c986402cd16d65d8534 100644 (file)
@@ -1,3 +1,7 @@
+2022-05-13  Noah Sanci  <nsanci@redhat.com>
+
+       * run-debuginfod-fd-prefetch-caches.sh: Rewritten.
+
 2022-06-02  Mark Wielaard  <mark@klomp.org>
 
        * Makefile.am (TESTS): Add run-debuginfod-federation-metrics.sh
index 66a7a0831979e8c16cbc3e2fce7e9b69565f6244..a538cd48781e58c06d5265e3ddc68cdfff490215 100755 (executable)
 set -x
 unset VALGRIND_CMD
 
-mkdir R
+# Set up archive folders for scanning
+mkdir R Z
+cp -rvp ${abs_srcdir}/debuginfod-tars Z
 cp -rvp ${abs_srcdir}/debuginfod-rpms R
 if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
     rm -vrf R/debuginfod-rpms/fedora31
 fi
 
-FDCACHE_MBS=$((1/1024/1024))
+# Set up maximums. 1 is just a convenient cap to test on.
+FDCACHE_MBS=1
 FDCACHE_FDS=1
-PREFETCH_MBS=$((1/1024/1024))
-PREFETCH_FDS=2
-PREFETCH=1
+PREFETCH_FDS=1
+PREFETCH=2
 # 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=8800
@@ -47,88 +49,63 @@ export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
 ######
 rm -rf $DEBUGINFOD_CACHE_PATH
 rm -rf $DB
-# Set mb values to ensure the caches certainly have enough space
-# To store the test files
+# Testing prefetch fd maximum (Set mb maximums to be beyond consideration)
+# Set --fdcache-mintmp=0 so we don't accidentially trigger an fdcache
+# emergency flush for filling tmpdir
 env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -p $PORT1 -d $DB \
-    --fdcache-fds=$FDCACHE_FDS --fdcache-prefetch-fds=$PREFETCH_FDS --fdcache-mintmp 0 -vvvvv -g 0 -t 0 -R R \
-    --fdcache-mbs=50  --fdcache-prefetch-mbs=50 \
-    --fdcache-prefetch=$PREFETCH  > vlog$PORT1 2>&1 &
+    --fdcache-fds=$FDCACHE_FDS --fdcache-prefetch-fds=$PREFETCH_FDS  -vvvvv -g 0 -t 0 \
+    -Z .tar.bz2=bzcat Z  --fdcache-mbs=100  --fdcache-prefetch-mbs=100 \
+    --fdcache-mintmp=0 --fdcache-prefetch=$PREFETCH > vlog$PORT1 2>&1 &
 PID1=$!
 tempfiles vlog$PORT1
 errfiles vlog$PORT1
 # Server must become ready
 wait_ready $PORT1 'ready' 1
 ########################################################################
-cp -rvp ${abs_srcdir}/debuginfod-rpms R
-if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
-    rm -vrf R/debuginfod-rpms/fedora31
-fi
 kill -USR1 $PID1
 wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
-# All rpms need to be in the index, except the dummy permission-000 one
-rpms=$(find R -name \*rpm | grep -v nothing | wc -l)
-wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
-kill -USR1 $PID1  # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
-# Wait till both files are in the index and scan/index fully finished
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
-export DEBUGINFOD_URLS="http://127.0.0.1:"$PORT1
-
-archive_hits=5
-SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
-for i in $archive_hits
-do
-  archive_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
-done
-metrics=$(curl http://127.0.0.1:$PORT1/metrics)
-regex="fdcache_op_count\{op=\"enqueue\"\} ([0-9]+).*fdcache_op_count\{op=\"evict\"\} ([0-9]+).*"
-enqueue=0
-if [[ $metrics =~ $regex ]]
-then
-   enqueue=${BASH_REMATCH[1]}
-   evict=${BASH_REMATCH[2]}
-else
-   err
-fi
-# This is an ad-hoc test than only works when FDCACHE_FDS < "archive_test"s above (5)
-# otherwise there will be no eviction
-if [[ $(( $enqueue-$FDCACHE_FDS )) -ne $evict ]]
-then
-   err
-fi
-# Test prefetch cache
-archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/
+# load prefetch cache with debuginfod-tars/usr/src/debug/hello.c
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo cee13b2ea505a7f37bd20d271c6bc7e5f8d2dfcb
 metrics=$(curl http://127.0.0.1:$PORT1/metrics)
 regex="fdcache_prefetch_count ([0-9])+"
-pf_count=0
-for i in $FDCACHE_FDS
-do
-  if [[ $metrics =~ $regex ]]; then
-
-    if [[ $(( $pf_count+$PREFETCH )) -ne ${BASH_REMATCH[1]} ]]; then
-      err
-    else
-      pf_count=${BASH_REMATCH[1]}
-    fi
+# Check to see if prefetch cache is maximally loaded. Note fdcache-prefetch (2) > prefetch-fds (1),
+# so the debuginfod will try to load the prefetch cache with 2 files. We want prefetch-fds to cap that
+# off
+if [[ $metrics =~ $regex ]]; then
+  if [[ ${BASH_REMATCH[1]} -ne $PREFETCH_FDS ]]; then
+    err
+  fi
+else
+  err
+fi 
 
-  else
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find source cee13b2ea505a7f37bd20d271c6bc7e5f8d2dfcb /usr/src/debug/hello.c
+metrics=$(curl http://127.0.0.1:$PORT1/metrics)
+regex="fdcache_op_count\{op=\"prefetch_access\"\} ([0-9])+"
+if [[ $metrics =~ $regex ]]; then
+  # In the test above hello.c should've been loaded into the prefetch cache.
+  # Ensure that searching for hello.c a second time accesses the prefetch cache once
+  if [[  ${BASH_REMATCH[1]} -ne 1 ]]; then
     err
   fi
-done
+else
+  err
+fi
 
 kill $PID1
 wait $PID1
 PID1=0
 
-
 #########
-# Test mb limit on fd and prefetch cache
+# Test mb limit on fd cache
 #########
-
 rm -rf $DEBUGINFOD_CACHE_PATH
 rm -rf $DB
 env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -p $PORT1 -d $DB \
-    --fdcache-mbs=1 --fdcache-prefetch-mbs=1 --fdcache-mintmp 0 -vvvvv -g 0 -t 0 -R R \
-    > vlog2$PORT1 2>&1 &
+    --fdcache-mbs=$FDCACHE_MBS -vvvvv -g 0 -t 0 -R R > vlog2$PORT1 2>&1 &
 PID1=$!
 tempfiles vlog2$PORT1
 errfiles vlog2$PORT1
@@ -139,26 +116,28 @@ wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
 # All rpms need to be in the index, except the dummy permission-000 one
 rpms=$(find R -name \*rpm | grep -v nothing | wc -l)
 wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
-kill -USR1 $PID1  # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
-# Wait till both files are in the index and scan/index fully finished
+kill -USR1 $PID1
 wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
 
-archive_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+# This many archives cause the fd cache to be loaded with just over 1mb of
+# files. So we expect the 1mb cap off
+SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
 archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
 archive_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
 archive_test 41a236eb667c362a1c4196018cc4581e09722b1b /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
 archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
 archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
 archive_test bbbf92ebee5228310e398609c23c2d7d53f6e2f9 /usr/src/debug/hello-1.0/hello.c $SHA
-archive_test d44d42cbd7d915bc938c81333a21e355a6022fb7 /usr/src/debug/hello-1.0/hello.c $SHA
-
 metrics=$(curl http://127.0.0.1:$PORT1/metrics)
-regex="fdcache_bytes ([0-9]+).*fdcache_prefetch_bytes ([0-9]+)"
-mb=$((1024*1024))
+regex="fdcache_bytes ([0-9]+)"
+# Since the server metrics report in bytes, $mb is just the total number of bytes allocated
+# to the fd cache. Ensure that this cap isn't crossed
+mb=$(($FDCACHE_MBS*1024*1024))
 if [[ $metrics =~ $regex ]]; then
   fdbytes=${BASH_REMATCH[1]}
-  pfbytes=${BASH_REMATCH[2]}
-  if [ $fdbytes -gt $mb ] || [ $pfbytes -gt $mb ]; then
+  if [ $fdbytes -gt $mb ] ; then
     err
   fi
 else