[Bug,debuginfod/29474] Server returns 404 for concurrent requests when leading to a same .rpm

Message ID bug-29474-10460-bQkGxJslAl@http.sourceware.org/bugzilla/
State Superseded
Headers
Series [Bug,debuginfod/29474] Server returns 404 for concurrent requests when leading to a same .rpm |

Commit Message

fche at redhat dot com Aug. 11, 2022, 8:17 p.m. UTC
  https://sourceware.org/bugzilla/show_bug.cgi?id=29474

--- Comment #1 from Martin Liska <mliska at suse dot cz> ---
Have a better knowledge of what happens. Let's assume the following debugging
patch:

       char* tmppath = NULL;
@@ -1776,6 +1779,7 @@ handle_buildid_r_match (bool internal_req_p,
         {
           // NB: now we know we have a complete reusable file; make fdcache
           // responsible for unlinking it later.
+          obatched(clog) << "INTERN " << b_source1 << " filename=" << fn <<
endl;
           fdcache.intern(b_source0, fn,
                          tmppath, archive_entry_size(e),
                          false); // prefetched ones go to the prefetch cache
@@ -1792,6 +1796,7 @@ handle_buildid_r_match (bool internal_req_p,

       inc_metric ("http_responses_total","result",archive_extension + "
archive");
       r = MHD_create_response_from_fd (archive_entry_size(e), fd);
+      obatched(clog) << "ASSIGN " << b_source1 << " filename=" << fn << " r="
<< r << endl;
       if (r == 0)
         {
           if (verbose)
@@ -1820,6 +1825,7 @@ handle_buildid_r_match (bool internal_req_p,
     }

   // XXX: rpm/file not found: delete this R entry?
+  obatched(clog) << "RETURN" << b_source1 << " r=" << r << endl;
   return r;
 }


debuginfod log shows:
...
[Thu 11 Aug 2022 08:02:42 PM GMT] (21225/21257): found mtime=1659137364 stype=R
source0=/home/marxin/BIG/test/cross-aarch64-gcc12-debuginfo-12.1.1+git287-1.1.x86_64.rpm
source1=/usr/lib/debug/.dwz/cross-aarch64-gcc12-12.1.1+git287-1.1.x86_64
[Thu 11 Aug 2022 08:02:42 PM GMT] (21225/21251): found mtime=1659137364 stype=R
source0=/home/marxin/BIG/test/cross-aarch64-gcc12-debuginfo-12.1.1+git287-1.1.x86_64.rpm
source1=/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
...
[Thu 11 Aug 2022 08:02:42 PM GMT] (21225/21257): INTERN
/usr/lib/debug/.dwz/cross-aarch64-gcc12-12.1.1+git287-1.1.x86_64
filename=/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
<- so here 21257 request interns libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
[Thu 11 Aug 2022 08:02:42 PM GMT] (21225/21251): SKIPPING due to
probe=/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
filename=/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
r=0 <- and due to that it's skipped here and we never assign r = ...
[Thu 11 Aug 2022 08:02:43 PM GMT] (21225/21251):
RETURN/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
r=0
...


Note in correct run the following happens:
[Thu 11 Aug 2022 08:16:42 PM GMT] (22289/22319): ASSIGN
/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
filename=/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
r=0x7fff740548c0
...
[Thu 11 Aug 2022 08:16:43 PM GMT] (22289/22319):
RETURN/usr/lib/debug/usr/aarch64-suse-linux/sys-root/lib64/libgcc_s.so.1-12.1.1+git287-1.1.x86_64.debug
r=0x7fff740548c0

So the problem is somehow related to fdcache.
  

Patch

diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx
index a089d0bd..0320f289 100644
--- a/debuginfod/debuginfod.cxx
+++ b/debuginfod/debuginfod.cxx
@@ -1743,7 +1743,10 @@  handle_buildid_r_match (bool internal_req_p,
         continue;

       if (fdcache.probe (b_source0, fn)) // skip if already interned
+      {
+        obatched(clog) << "SKIPPING due to probe=" << b_source1 << "
filename=" << fn << " r=" << r << endl;
         continue;
+      }

       // extract this file to a temporary file