PR29474: debuginfod
authorFrank Ch. Eigler <fche@redhat.com>
Mon, 15 Aug 2022 10:20:10 +0000 (06:20 -0400)
committerFrank Ch. Eigler <fche@redhat.com>
Mon, 15 Aug 2022 10:20:10 +0000 (06:20 -0400)
Previous code sometimes confused debuginfod with concurrent queries
targeting the same RPM.  One thread fetching & prefetching, the other
thread misinterpreted the sudden presence of its target file in the
fdcache as a mere unnecessary prefetch duplicate.  But if it was the
other thread's target file, previous code would -skip- it completely,
resulting in a 404 error.  New code allows the other thread to also
decompress the target file and return it, and still continue to its
own prefetching process for other files.

There's a performance trade-off here.  Another option would be for the
other thread to check the fdcache regularly and abort its own
prefetch/fetch/prefetch loop early in case of a sudden target file
hit.  That'd save CPU probably but it'd stop prefetching of later
segments of the input archive, which could save future time.

Automated testing is too time/load sensitive to attempt.  Confirmed
working with Martin's stress tester.

Reported-By: Martin Liška <mliska@suse.cz>
Signed-Off-By: Frank Ch. Eigler <fche@redhat.com>
debuginfod/ChangeLog
debuginfod/debuginfod.cxx

index a8b5d7f..7cc9bca 100644 (file)
@@ -1,3 +1,9 @@
+2022-08-15  Frank Ch. Eigler <fche@redhat.com>
+
+       PR29474
+       * debuginfod.cxx (handle_buildid_r_match): Don't trigger false-404's
+       for concurrently prefetched target files.
+
 2022-08-02  Josef Cejka <jcejka@suse.de>
 
        * debuginfod.cxx (groom): Don't evaluate regex unless needed.
index a089d0b..9245be5 100644 (file)
@@ -1742,7 +1742,8 @@ handle_buildid_r_match (bool internal_req_p,
       if ((r == 0) && (fn != b_source1)) // stage 1
         continue;
 
-      if (fdcache.probe (b_source0, fn)) // skip if already interned
+      if (fdcache.probe (b_source0, fn) && // skip if already interned
+          fn != b_source1) // but only if we'd just be prefetching, PR29474
         continue;
 
       // extract this file to a temporary file