diff options
author | Noah Sanci <nsanci@redhat.com> | 2022-05-13 14:32:27 -0400 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2022-06-03 18:21:54 +0200 |
commit | 48c37efa32009cafcbf57dc1ca256715df2980c9 (patch) | |
tree | d988ff26504ce6a57ac2da8c74b73b27de5750c1 | |
parent | 88c355011a78b5030fefedd10630bc99cecaceb6 (diff) | |
download | elfutils-48c37efa32009cafcbf57dc1ca256715df2980c9.tar.gz |
PR28577: Make run-debuginfod-fd-prefetch-caches.sh test something
Update to the run-debuginfod-fd-prefetch to make the test more
sound.
Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r-- | tests/ChangeLog | 4 | ||||
-rwxr-xr-x | tests/run-debuginfod-fd-prefetch-caches.sh | 123 |
2 files changed, 55 insertions, 72 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog index fb956925..6ea8e792 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -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 diff --git a/tests/run-debuginfod-fd-prefetch-caches.sh b/tests/run-debuginfod-fd-prefetch-caches.sh index 66a7a083..a538cd48 100755 --- a/tests/run-debuginfod-fd-prefetch-caches.sh +++ b/tests/run-debuginfod-fd-prefetch-caches.sh @@ -22,17 +22,19 @@ 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 |