From 7c632c5c2ed8e75c8104278ef2bcff67b5596860 Mon Sep 17 00:00:00 2001 From: Omar Sandoval Date: Tue, 23 Jul 2024 15:35:42 -0700 Subject: [PATCH] debuginfod: populate _r_seekable on scan Whenever a new archive is scanned, check if it is seekable with a little liblzma magic, and populate _r_seekable if so. With this, newly scanned seekable archives will used the optimized extraction path added in the previous commit. Also add a test case using some artificial packages. Signed-off-by: Omar Sandoval --- debuginfod/debuginfod.cxx | 145 +++++++++++++++++- tests/Makefile.am | 13 +- ...pressme-seekable-xz-dbgsym_1.0-1_amd64.deb | Bin 0 -> 6288 bytes ...compressme-seekable-xz_1.0-1.debian.tar.xz | Bin 0 -> 1440 bytes .../compressme-seekable-xz_1.0-1.dsc | 19 +++ .../compressme-seekable-xz_1.0-1_amd64.deb | Bin 0 -> 6208 bytes .../compressme-seekable-xz_1.0.orig.tar.xz | Bin 0 -> 7160 bytes .../compressme-seekable-xz-1.0-1.src.rpm | Bin 0 -> 15880 bytes .../compressme-seekable-xz-1.0-1.x86_64.rpm | Bin 0 -> 31873 bytes ...sme-seekable-xz-debuginfo-1.0-1.x86_64.rpm | Bin 0 -> 21917 bytes ...e-seekable-xz-debugsource-1.0-1.x86_64.rpm | Bin 0 -> 7961 bytes tests/run-debuginfod-seekable.sh | 144 +++++++++++++++++ 12 files changed, 316 insertions(+), 5 deletions(-) create mode 100644 tests/debuginfod-debs/seekable-xz/compressme-seekable-xz-dbgsym_1.0-1_amd64.deb create mode 100644 tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.debian.tar.xz create mode 100644 tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.dsc create mode 100644 tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1_amd64.deb create mode 100644 tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0.orig.tar.xz create mode 100644 tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.src.rpm create mode 100644 tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.x86_64.rpm create mode 100644 tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-debuginfo-1.0-1.x86_64.rpm create mode 100644 tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-debugsource-1.0-1.x86_64.rpm create mode 100755 tests/run-debuginfod-seekable.sh diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx index cf7f48ab7..5fe2db0c4 100644 --- a/debuginfod/debuginfod.cxx +++ b/debuginfod/debuginfod.cxx @@ -1998,6 +1998,109 @@ struct lzma_exception: public reportable_exception // // 1: https://xz.tukaani.org/format/xz-file-format.txt +// Return whether an archive supports seeking. +static bool +is_seekable_archive (const string& rps, struct archive* a) +{ + // Only xz supports seeking. + if (archive_filter_code (a, 0) != ARCHIVE_FILTER_XZ) + return false; + + int fd = open (rps.c_str(), O_RDONLY); + if (fd < 0) + return false; + defer_dtor fd_closer (fd, close); + + // Seek to the xz Stream Footer. We assume that it's the last thing in the + // file, which is true for RPM and deb files. + off_t footer_pos = -LZMA_STREAM_HEADER_SIZE; + if (lseek (fd, footer_pos, SEEK_END) == -1) + return false; + + // Decode the Stream Footer. + uint8_t footer[LZMA_STREAM_HEADER_SIZE]; + size_t footer_read = 0; + while (footer_read < sizeof (footer)) + { + ssize_t bytes_read = read (fd, footer + footer_read, + sizeof (footer) - footer_read); + if (bytes_read < 0) + { + if (errno == EINTR) + continue; + return false; + } + if (bytes_read == 0) + return false; + footer_read += bytes_read; + } + + lzma_stream_flags stream_flags; + lzma_ret ret = lzma_stream_footer_decode (&stream_flags, footer); + if (ret != LZMA_OK) + return false; + + // Seek to the xz Index. + if (lseek (fd, footer_pos - stream_flags.backward_size, SEEK_END) == -1) + return false; + + // Decode the Number of Records in the Index. liblzma doesn't have an API for + // this if you don't want to decode the whole Index, so we have to do it + // ourselves. + // + // We need 1 byte for the Index Indicator plus 1-9 bytes for the + // variable-length integer Number of Records. + uint8_t index[10]; + size_t index_read = 0; + while (index_read == 0) { + ssize_t bytes_read = read (fd, index, sizeof (index)); + if (bytes_read < 0) + { + if (errno == EINTR) + continue; + return false; + } + if (bytes_read == 0) + return false; + index_read += bytes_read; + } + // The Index Indicator must be 0. + if (index[0] != 0) + return false; + + lzma_vli num_records; + size_t pos = 0; + size_t in_pos = 1; + while (true) + { + if (in_pos >= index_read) + { + ssize_t bytes_read = read (fd, index, sizeof (index)); + if (bytes_read < 0) + { + if (errno == EINTR) + continue; + return false; + } + if (bytes_read == 0) + return false; + index_read = bytes_read; + in_pos = 0; + } + ret = lzma_vli_decode (&num_records, &pos, index, &in_pos, index_read); + if (ret == LZMA_STREAM_END) + break; + else if (ret != LZMA_OK) + return false; + } + + if (verbose > 3) + obatched(clog) << rps << " has " << num_records << " xz Blocks" << endl; + + // The file is only seekable if it has more than one Block. + return num_records > 1; +} + // Read the Index at the end of an xz file. static lzma_index* read_xz_index (int fd) @@ -2333,6 +2436,11 @@ extract_from_seekable_archive (const string& srcpath, } } #else +static bool +is_seekable_archive (const string& rps, struct archive* a) +{ + return false; +} static int extract_from_seekable_archive (const string& srcpath, char* tmppath, @@ -4282,6 +4390,7 @@ archive_classify (const string& rps, string& archive_extension, int64_t archivei sqlite_ps& ps_upsert_buildids, sqlite_ps& ps_upsert_fileparts, sqlite_ps& ps_upsert_file, sqlite_ps& ps_lookup_file, sqlite_ps& ps_upsert_de, sqlite_ps& ps_upsert_sref, sqlite_ps& ps_upsert_sdef, + sqlite_ps& ps_upsert_seekable, time_t mtime, unsigned& fts_executable, unsigned& fts_debuginfo, unsigned& fts_sref, unsigned& fts_sdef, bool& fts_sref_complete_p) @@ -4336,6 +4445,10 @@ archive_classify (const string& rps, string& archive_extension, int64_t archivei if (verbose > 3) obatched(clog) << "libarchive scanning " << rps << " id " << archiveid << endl; + bool seekable = is_seekable_archive (rps, a); + if (verbose> 2 && seekable) + obatched(clog) << rps << " is seekable" << endl; + bool any_exceptions = false; while(1) // parse archive entries { @@ -4357,6 +4470,10 @@ archive_classify (const string& rps, string& archive_extension, int64_t archivei if (verbose > 3) obatched(clog) << "libarchive checking " << fn << endl; + int64_t seekable_size = archive_entry_size (e); + int64_t seekable_offset = archive_filter_bytes (a, 0); + time_t seekable_mtime = archive_entry_mtime (e); + // extract this file to a temporary file char* tmppath = NULL; rc = asprintf (&tmppath, "%s/debuginfod-classify.XXXXXX", tmpdir.c_str()); @@ -4448,6 +4565,15 @@ archive_classify (const string& rps, string& archive_extension, int64_t archivei .bind(5, mtime) .bind(6, fileid) .step_ok_done(); + if (seekable) + ps_upsert_seekable + .reset() + .bind(1, archiveid) + .bind(2, fileid) + .bind(3, seekable_size) + .bind(4, seekable_offset) + .bind(5, seekable_mtime) + .step_ok_done(); } else // potential source - sdef record { @@ -4461,11 +4587,19 @@ archive_classify (const string& rps, string& archive_extension, int64_t archivei } if ((verbose > 2) && (executable_p || debuginfo_p)) - obatched(clog) << "recorded buildid=" << buildid << " rpm=" << rps << " file=" << fn + { + obatched ob(clog); + auto& o = ob << "recorded buildid=" << buildid << " rpm=" << rps << " file=" << fn << " mtime=" << mtime << " atype=" << (executable_p ? "E" : "") << (debuginfo_p ? "D" : "") - << " sourcefiles=" << sourcefiles.size() << endl; + << " sourcefiles=" << sourcefiles.size(); + if (seekable) + o << " seekable size=" << seekable_size + << " offset=" << seekable_offset + << " mtime=" << seekable_mtime; + o << endl; + } } catch (const reportable_exception& e) @@ -4496,6 +4630,7 @@ scan_archive_file (const string& rps, const stat_t& st, sqlite_ps& ps_upsert_de, sqlite_ps& ps_upsert_sref, sqlite_ps& ps_upsert_sdef, + sqlite_ps& ps_upsert_seekable, sqlite_ps& ps_query, sqlite_ps& ps_scan_done, unsigned& fts_cached, @@ -4533,7 +4668,7 @@ scan_archive_file (const string& rps, const stat_t& st, string archive_extension; archive_classify (rps, archive_extension, archiveid, ps_upsert_buildids, ps_upsert_fileparts, ps_upsert_file, ps_lookup_file, - ps_upsert_de, ps_upsert_sref, ps_upsert_sdef, // dalt + ps_upsert_de, ps_upsert_sref, ps_upsert_sdef, ps_upsert_seekable, // dalt st.st_mtime, my_fts_executable, my_fts_debuginfo, my_fts_sref, my_fts_sdef, my_fts_sref_complete_p); @@ -4639,6 +4774,9 @@ scan () sqlite_ps ps_r_upsert_sdef (db, "rpm-sdef-insert", "insert or ignore into " BUILDIDS "_r_sdef (file, mtime, content) values (" "?, ?, ?);"); + sqlite_ps ps_r_upsert_seekable (db, "rpm-seekable-insert", + "insert or ignore into " BUILDIDS "_r_seekable (file, content, type, size, offset, mtime) " + "values (?, ?, 'xz', ?, ?, ?);"); sqlite_ps ps_r_query (db, "rpm-negativehit-query", "select 1 from " BUILDIDS "_file_mtime_scanned where " "sourcetype = 'R' and file = ? and mtime = ?;"); @@ -4681,6 +4819,7 @@ scan () ps_r_upsert_de, ps_r_upsert_sref, ps_r_upsert_sdef, + ps_r_upsert_seekable, ps_r_query, ps_r_scan_done, fts_cached, diff --git a/tests/Makefile.am b/tests/Makefile.am index cfed54b7f..aee5413fd 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -227,7 +227,7 @@ export ELFUTILS_DISABLE_DEMANGLE = 1 endif if LZMA -TESTS += run-readelf-s.sh run-dwflsyms.sh +TESTS += run-readelf-s.sh run-dwflsyms.sh run-debuginfod-seekable.sh endif if HAVE_ZSTD @@ -630,6 +630,10 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm \ debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm \ debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm \ + debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.src.rpm \ + debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.x86_64.rpm \ + debuginfod-rpms/seekable-xz/compressme-seekable-xz-debuginfo-1.0-1.x86_64.rpm \ + debuginfod-rpms/seekable-xz/compressme-seekable-xz-debugsource-1.0-1.x86_64.rpm \ debuginfod-ima/koji/arch/hello-2.10-9.fc38.x86_64.rpm \ debuginfod-ima/koji/data/sigcache/keyid/arch/hello-2.10-9.fc38.x86_64.rpm.sig \ debuginfod-ima/koji/fedora-38-ima.pem \ @@ -640,6 +644,11 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ debuginfod-debs/hithere_1.0-1.dsc \ debuginfod-debs/hithere_1.0-1_amd64.deb \ debuginfod-debs/hithere_1.0.orig.tar.gz \ + debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1_amd64.deb \ + debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.debian.tar.xz \ + debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.dsc \ + debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0.orig.tar.xz \ + debuginfod-debs/seekable-xz/compressme-seekable-xz-dbgsym_1.0-1_amd64.deb \ debuginfod-tars/hello-1-1-x86_64.pkg.tar.xz \ debuginfod-tars/hello-debug-1-1-x86_64.pkg.tar.bz2 \ debuginfod-tars/pacman-sources/PKGBUILD \ @@ -669,7 +678,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ testfile-dwp-4-cu-index-overflow.dwp.bz2 \ testfile-dwp-cu-index-overflow.source \ testfile-define-file.bz2 \ - testfile-sysroot.tar.bz2 run-sysroot.sh + testfile-sysroot.tar.bz2 run-sysroot.sh run-debuginfod-seekable.sh if USE_VALGRIND diff --git a/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz-dbgsym_1.0-1_amd64.deb b/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz-dbgsym_1.0-1_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..75cb984c8a071373e64ee9d78a2956b813796009 GIT binary patch literal 6288 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 literal 0 Hc-jL100001 diff --git a/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.debian.tar.xz b/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.debian.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..9b2e48c07a05d48ab5997c9af514ce3aac141549 GIT binary patch literal 1440 zc-jG=1z-C8H+ooF000E$*0e?hz~2ghP$2;p000000001fj0|DmC;tUkT>vr}NNor1 z@tIyK_)om_N=i<6S-%T;fOGB2GRB9q4BH)7u*{O+35*lzS?P;V?>R9m3|5mRC1vlm zpdl4bJBbbDh$n$YctsuncBa4);~^V*qxuz;gg9h)*KSpPVWKeb?g?+GlrlvNrQcgTfUJantdls#`}KO4P-Qg}vo)6p8f-(j5B z$9r@8gxU_UB&?a@ta;Z63hK@27KRfyWzEa4NOzQtw{Wi8 z$z0x+^#qZ_ec39;WI#|n@ud0}_qOEj7UZ`kY~QHZRO<8gTk#HKF0evhS;lLj=c9-490N*$8zT7vVu0pd z%>9W9C;8AZ{vpn91rjn$i$lFJpnIV?Q>E&Im5MaU9M&ob9s#Rte%`1Wj<4kS}vy?~e1TLSIXABEBB zKX<9mRT#-HQt^lH5na8B%Ts$+ELZ*XOOa-{szny%o3>ECz$M)zQQjf3ckvo$?+^L4 z`ZUv0N$Shx2}%oJR7JebGx> z1vL42G?s8&_IwUJPgqn%=E+z{(9BGkjNFZqY`C9(2%%maJ;Za*TgkS;N|S|qvF+Vr0B%O}co(x77PNNIL|V)?0gt+6K5+eC`LFCmcy(ywV_KG>lRBnI za`%y9z)Yd{c8bqYX}qTUX?jw)!)BDx_7hRRpAU8`uN4~fh`r+OJAo8vG9KKTNE{cW zDd{U93d7*#F|Xag)e_sbe_=(Vw#aV?pjHh}6_n`EiLQj#nhkS&j)RJ4aUe@DTNTD` zSqAJ5y(k27IX3c#imik@u<$y<9^Zm(mc{B-_UGI_I(3=*_IZt@zs1Ok(va9>}i6(5dJkmL)dp&Sm63Yk!BBpN9QrvUqU$ga}D1+Cz u+Y_q>#eNQlfB*nA5!+sa^F8$d0s9JoPyhfey;XOy#Ao{g000001X)^04!WuU literal 0 Hc-jL100001 diff --git a/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.dsc b/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.dsc new file mode 100644 index 000000000..5ba2559e7 --- /dev/null +++ b/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1.dsc @@ -0,0 +1,19 @@ +Format: 3.0 (quilt) +Source: compressme-seekable-xz +Binary: compressme-seekable-xz +Architecture: any +Version: 1.0-1 +Maintainer: Omar Sandoval +Standards-Version: 4.5.1 +Build-Depends: debhelper-compat (= 13) +Package-List: + compressme-seekable-xz deb misc optional arch=any +Checksums-Sha1: + bb182efecbbe8a3f9921b411201203711bd66722 7160 compressme-seekable-xz_1.0.orig.tar.xz + 76d7e5457e8cafda6c2d5591ea6701ec39d2be56 1440 compressme-seekable-xz_1.0-1.debian.tar.xz +Checksums-Sha256: + e221d529467a253ddab35e735d1e049826292a3bd395e8f65f690919a9b508d6 7160 compressme-seekable-xz_1.0.orig.tar.xz + 71c40c722a9ff5cace7226a5c75d56dfe11aa220bf5a95a163438a971649e056 1440 compressme-seekable-xz_1.0-1.debian.tar.xz +Files: + bd331eb0439afb87ecef108c7ef6652e 7160 compressme-seekable-xz_1.0.orig.tar.xz + 2ce6642053700808bb65226dde0b6603 1440 compressme-seekable-xz_1.0-1.debian.tar.xz diff --git a/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1_amd64.deb b/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..6900119ae0bd20c550b3c78f62eb3a2c26e77df4 GIT binary patch literal 6208 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 J;r=^g{0~DD#Kr&s literal 0 Hc-jL100001 diff --git a/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0.orig.tar.xz b/tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0.orig.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..6a54d20c8b3ede88943856ededcc33cb1b5b1338 GIT binary patch literal 7160 zc-jH@8wce5H+ooF000E$*0e?f03iVu0001VFXf})cmEr>T>vqg$@BKSj>XUZj0>{X z|2n zzpi@S`~;%^t&iCTTj;`|>|Bc#ux7PKp<5fxK~GGJ0Zo;1dubcR1?Djb6-V;4G*_34 zGtvfa*|j{-PH+^L*1QpX>_ zy6=}gh1?|q{Qzw6E=tNP6MH%IK>0{3oT1DNf5^S#nPyyvS>;>UFq9Y}SI|R@k*~vw z!*<+Dpzg%&iy9A)3rx6SrQ(<6Ta(XD`aMy>pkU71P3mD$jjOkZE$%Blowc$VTCzec zClSy84GY$_G~za);#k+waMcuIimx{L$7ocN75f;&TS9>l&rk1}#F~NR_r35NrxhJ3 zS;fG5V)w07n3Bx^rRk>>w6fh~4872Bum0m9c{M7mL`;&5p@ELw4D9ne5K0uJ+-qeT zkB^~J_oud?#fvU95hd62h7~rkcs?-Bf!&6p=zitkfJcgvt%IWY3iX1s_qXk;5DEFc z7;B$N`SUC6Qx1yc@eZp85ULZ0qge76m@z}<^(w>3SI;kY9npA@%-)Sg6im9qb{+H_ z0mV0NhpQuzS8@sh3<+p(g#eY+voCFT?*hwCnfCY`o$6m8vlq#%t072HAI$GHK38s6 zq;HV`E8qy{d4`GD-5z73$O#U59L;xqzp(P$!WJhQZ^ERhF43aq^KmH!Clx!}MdlCp5MeI-6Wu+<`AvxPr=Xp?M z-LjMNj59fcE_ScKt#Ov+N-&j|b@oljBGfW}yR=U@E86oa0IEK`T@JRY<)Vv2Jozmyg4ej^#Y{Od=M6K3ry{!p3L=R#l&qsycF z3dpJmB9_7R2wtrBuA)#ir1FiasN@LfZ7^y>z%eaI1X)GffPe22i52;WmSZG%RaYxu zIUc_pI_TuK7~Il?>Sr)8~T(O`IM|Mo0P<6WhLkTI_fWB=nZ?a+V8$n%$r!I#?c)=x8v=J z3kQMP3PoA}16XtdqlJFU6CxwMq;o7E+C1oRvXsVNy9FVdki&)RA7Hb7tKeY>#0swK zfJJ+y>!&-?+!ioma!(!Q#Ns)*-?ybw?Qf+xP+ zDZw@JYD~V1*}YS)l7kH%U3pC!r^ap2>zKk zy9GD6#s64Zy|E0aS+b?NYVDlHu!i7Xiyr0=(Hx=my0m&3D!zCf+fbE7ha7WMpmk+8 z`N*FX&mih2EPn(zUIzSsg@qbEb9=?b$d39>^J3FXIb{RHwkYD5Oc^d`1IYNP3f#A% zyqF>Rk!%a<2{LCf^6f^ZNZY6yq(oiLD%bhp@*!QTrfqOQW{arRDv3dS9PQQcx(#+# zv~ExWG4i2tirTyx!-xJ>`?^O{`X{%yv~0L{(Je%Z4f?eqboy-EhM4VJVTFwfRjQBI z5hkMn>oGAMo0g4;loo}cgO5Q>03B{AjOF-n+hFO0@INmY>6&7R_vWib7xNln-xt9s ze)eRk#Smp#S==5hvziE=pc?@8+@c#u_q@oBces7*c=#Y{0I8ixRgs{eLOnvB*uG?l zQHQzP_8@AlcEw?{9LgV26u@Nwee};yR@IH%!;WNO-pK0!kOtsjhem0Ro@d^<8oG-D z<|TTu^m$x6#Ke#UL9U=ta2E}ZrrL7*_T24NDp7D}4DB)ivn(eN>{m0$-97}{*5EY$ z{@8!`BM?ESA{*gam5;VTa1GaqPI+VR7F2R$|56J$-%u4|C-JSWeiUy60uhtR5iOW! z$%WEAAK^-xOO&;Z#p-U#AZ`f2_j5L1Rv=Ilb`A*0v_U`vSoy$FMeUmNoTY!TokD3L zk-UG|{fX+YK>a^;bkw4N*q-J0rSHilFAp);Qk(a9#qc@5t|*@m+BmvleFt&RZDovJ zq5dzXx{Z{x(6c!?{70Ot#(4JYSpO)U+!qdP%MUx4l;vvjEyH3)4haN{|T( z_Q;;qhckib|Iw?#*C2RqE)2ji$a(=X?JKL&g~|OAKqGzyru4kjfVSAiXp*_*@(O_L ztAfL_)a*b^d1Q;p`2T^OW--bNxcL+Y_JM&LrDF$0zB;M&B$@z^L*%!R<>rb(Qi9+< zO0u1*&AuqM6ujCnM?!XaYDI~^$wMZd6t8`Q3~0GlKFvYGoI0{(MS?0P<1LKlFI`!> z6)&`3i|Gx)f3`M?0n+n>s#t_}mWJ^N1Zw73?`7A5+@J`$n*SP(wwOcf)m~uln#p&+u_* zqaFi$>l2%mp!$EkHFO(u5q96svP|jWcbFwwKM3*pmk8HUNAXFD!}!Kiy8H|%bDjer zllMBl;Y`}2_e6%XF*Vf5)ITX(TGuzb+8-r=kx@Ug?rxj#nl1b~RCm3|oVK=0Tg)w> zUkL53nPr4en;f~KMZiuBkaY67hU!$(%-?@s5utnE#62aXOF%il%>t1SQ^z^U>10uE zJr0F<`yDcs^X{GF6x4SLE(DkC4co0R?fW%f;9!8UAJGe;i@}=c!ePwIrR6cv@?SIC zJPL!qfB`ZRir4+4Ri#Wqb%$ksFK~cDlV+P z_DVvg;>zNnqfAre-Ex$?^wQijHTpf)^m;aP~&^bip6`RY;~J}L+vr8 zZbVWUZRx7LgU^@t53p9=q(@&LG(UFTro{xS;;az_LOQ#;iKsP)ryqO@&F)o@JW9DK zj<)J&=E_Qd{sGY2=(aPzYf8X8rq;w`L~OYM1R?>vsrq;%BM`J$c!049{f#cQL5i`s zMdA~=5;X9Yvg)17FH#r238SJ%88%?bd@lV!EUUkkQ57y)#G89>Z zVN(?sF5v6?2ke+J-Iz}2(674G@8 zNI@x4j2hBV&CM`1nW*zQ?kElIwruWWJr758&wUF6+^41{+ug)JxoVfNg^Ta$TsNM;igYhF=k=M=&IgJHM&sd>Pp1=i-*5(93?RZFRttFm zA~}K~2Tq4qu+SL40sB?rUBKeO!W^=sP~sHi>JF8b^Ups#kc_^;E*TC=ladlmd$uGZ zqSOQsZYy6|1yOC#nHEppwvtmRId|}4vM8We1@CL{I}Rg0Q@Pgx&zM?74q`8V>I|x> z&I^04hD9I8T)g2JnliK-zQute)h#A^L&zu+*|qP%FIC6g<3S&c1BvT(aaM5La`ntj znjxcFQ{y~JIX3n@5MK#K#gTFFiJy>KYEkoYfKFEZT>7x`a?YiQNzIF`%SJUhwYkR_ zTRn=_2P+A8)|0WHs(&hAPQb~vigUNZg{B%<{t_rTo5QSQlRDkpN|2@A^NC}!b#nIv z8VJ*5m{pbDAnqir=DiZe(>t_tl=@z+Pv#Y^!iI*aRGg=;CA$##3;-_?|I)^WQS3(;R7tiR(QA3ztX6|k8FS9^wUSrXH!ChbIEP4Qh=O#6gH z$~?WcYm;Cf|I*(gP3ZFH&4Y;FTRMNGRrc*$i`J&~<<*ZwJG^ zuNH|8olnze(Q)Rcy0(`9RQY_5!_1=ZgglV7y^fRa`y71kLjWoiCp478hXoZ#l5gv> zxST159&%A=yf3V-Zt!#zcX6UF1cHsB1YqdFss~GdUx1Um+AL>LhADWI8;{p z1}3Jrw|3Q;0ylaj4uTE(1erLEjR+u*o{B(m4N3P4#o zg*9z*?TaU=hEtl;jnVpu}F89gGHS-Nv&?qwCfl=rC7{itSM>GjU=| z#jflXh*_a7zYbN6PvNDej~n=kwof+B*K1x>&t}(57~zp};xJ`iGh_{@NXZa_7iwe7 zjxO4RJG-nrnfy=XYt9c~2GAGm%+Fpm3HLPyb>NHjJm|&+-`7o`aL&?zwI42gIfbRR zG}qA&-|9U=i&c8(KKxhKAX>d81f6I5ZjbBoCW5avuWp%9t%mVYIE5OHc@R{Fg)Is~CIRB$G_WKJ!Ao%ilW2Hjf{I zuy=vnE`uAX1lYvZr7HP?$)TPfr!ckj6zVX^Iqnwoq~1SG{4}h;FL`Zr_=I`$=OK|l z8Y4>2^5z)^A$8=zN_B@@m3KQ5Td(-cU0p>=IqXYK|2W1-PbohGOF0b*pXD{PdmFjC zPefP~8=8K8FzSAMx|P7#FF(1Q)WPe8&d`XX4HL*0!ZhgvaVmOR!P~ea6uT{Wj9!$6Po1mdYCwzLlgVHp z@SR~N>1V0&BnGy2(>YcH(R#Z0Dq2j6>U(Y?uL*8_&JnIb@q~$V62=wUisUh`gA?b$ znZ9YECR;P78jBWr8ZYjpl@xMV>uxUU#xdF$;%no$^8_o>HIq@giapIF zD~r;M5Yte6;`_blnJVA@t*e;0==FPwd`kLs&s!l5_2pa-XFR(ZtgfYt4awiaVvGLN4FCF2kgQ$igNU>p%-+p4p7^jEjR5p`95Ws}lW#Ik?mo-@ga8Vv-T_Z9iN<-$L@pm;SDImd zGHhR$n*UlAcPm&t^Nr$)C%jMKS;qOylf*eELajh-2!veuy;lSR2p`dAs*-mo1LgTJ zc2NzKP4wq?l)1BxMR2Bc9761b{J$#)2~RF63eof<)ehei9X2fXUJpl8PkfUFmZTqc-^ zKa1FvpqF@~ysZ!?;Hp#kTTput=<%*k5EJ}PhUI%Ov>n3!GQiz+FgMTfHMkfJ6`cQc zE!P$1Os5_1Rt{^_61DDt*wA(FkP@N);*gepK8ho+D>Q?$Zb4w~Zi3|7{yus`8>-wj zV;?qLa+gf@tbH<>2?HjP`0j4YV*>##tnshS!)n=8V9YfIH%?g5ZTLwtUH1%1-VK1j zV4y7Qy0V#W^Qt|e`4NBBNJ9aNgU1zIpA2F@hL$q<5`edd;QiGW8sR_zZQPHFI690K z+?#G(1I{&B?~XknjgZPmzeM%RH-9N~GV^kf49BYN#eE=|WJFP^Z0oH45Fv3g0dkHk z2lRih_-_8fV1=8ZR{DHw7|wgNu2UeTBq#p=-U)<8*>K#!doArN`4%af2yXnHqMIa9E5yjr))A zwQ$m)q^XZC8|I^Zj&1f|-?`yV5jz<2C3^a%ZOtbtHYYZNw3L z;rgZ3F;GG$Xo5IXo+F7-vuKVKo;Im7feI9ueilI0HNZCxFO~Ry#7+yzsoU&B>h%jm z+R~#4`cR1^<`LMRebrdU%mO{gbr+{}cx-7S?8VD;pJ^B7Fy_SI?5(JAW;P*s0y!WG;)FjG{SEd%4{8p82=?YsbNacdu~qX#{GSz7S~cqARR|?!9Hpe?d2tpRCTZ_(B!v0gre0(<8 zHU4{VA7^3jD8w&&@`>*fCG>xc)rD}!omy0hNw=QY3hy*kV6KR!8qZ=mhM9#;0r#i7hk9 zH9tc!GlB?8U_Xv!X1kGE`TRQ&5FN$KsajOYQDb~JxhKUc_rIeuRTI-R zJU|+FUrq-|Sm zsQMm#{U@l7KUP&o0;C>;)}d3kxnG`S&&aV8yDu3e01=IJ4l0UyoyPjouVz~ZfWy@FrRrqPgDJ-ofs;5fjBr>Pun{<(yg7l z&pq6ZW-zog0&{5N@#~dPZGXsA%VV?EZ{T3jv1>hj23xyXnaT|7(Bft->{FXZlWjl4 zfCwdO7|>MsQOCzDK{*DzqoKI>LOFyP5wQ_Xj$c!~i#rvglEa2lgI@I_A-ibJ9}W*p zhf@4I@HKT3Z47n_18sU?^B$zG^SAHLF&Pu0?d56>byvcQ zMW0lTsp|*Jrhh12d(f_gE!#Flxd->9E)DvuTc&KscH{6gHP4!S|5=z+6lfIo88_7j zbjWkY;RuM5Gm;h{f~|lVHf8TD?!BUvX+!Fdi1d+`^rJ8d90n|5u@BskW8hseC#Ao{g000001X)_=v(`TV literal 0 Hc-jL100001 diff --git a/tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.src.rpm b/tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..ada76efcf3d952a33f268323bbd49150152a909b GIT binary patch literal 15880 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 T3-{;Ezw>Q)I)A>&2LSvZ11UFp literal 0 Hc-jL100001 diff --git a/tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.x86_64.rpm b/tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..923ab96b3082592dc90c48ae2c50f5977ad88811 GIT binary patch literal 31873 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 literal 0 Hc-jL100001 diff --git a/tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-debugsource-1.0-1.x86_64.rpm b/tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-debugsource-1.0-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..3595e5a37ff02914a050759cfd443395ca981156 GIT binary patch literal 7961 zc-rlmdvp_38o(!gLa{)lP+rT1v&*B(q?yTNk|2fBhL*C0RtnnkXt^_UryWU?I5X)3 zSZUoJR9HZ$;$sB?sffrM1a=i&dC75AKtw#16_KqVtp!1;EZyu)<|_(ESN8vWr!#kc z_j}y;o#{>M#&4RUDIzA(SK(K&rd42C!+16lJeaPYLrYi)lxe}08XSF|q%q|30Jj+al;7}=ZUcQS z=r4i3o~X?{%Lp9CPGplEJhF-|C(BqJh!?F^mn^tAQRK0W#SA42$ic~o5gDg|Wryr^ z@UjgFtjo@EPK=NwGO}c|*%{H!Ar~X_oQUlX7Fn$hmsNJ)aP<@G+G3xqtB?KgNYcmL zPI}$`28xPpp&}BIh(shJ5s64dA`+2^L?j{+iAY4?Oe7c#K1qeoG;TRJaZ*%VBT2_l z;d70+r@=-dR~NA9JSPdAn?wO$03HJTHFfK`O6XjoE4l6kZUvqJ{0$X8S26VjZZrH% z$-tLEZwCGz^uGsgH{zM>z#X8^0sas0M1x~uAl?+C4Kbm*MiZU^+!c5ha01v%z}<}g zFnNIQ0^SUq2=-fndw_lqa8KZOfRmwq|A6}S2LG#|PXYTIz^fUBPGl2U8 zzXd$ph#%Di@txp*4%h|u=YdBW932mwZTLs`1I{u0qpeV%@xV^tT=35TE&{z9xES<# zz)z@9h5);AOx9)aPTUk7RJ{Hed|=Iku+ zD0e8wY-DL>*{7QQNSuwzu=(dhP*chk?WT=i^;Ieoag_egFqVW{3q~q72Q(}PJm#u$ z>?QFkvB&3Eyk%zO_j?o(>59**ne}p{hYZPsq9t^eL5c$}606cTGN3#|y?NezF3gxg3@44Ic@8$;gr8odIFBL> z&w?0O%2qsh5~{#jDh0Ywj$0|in*L*60jlx%P}o=-k1BD2ie;txc6F{+G$)m^S*#Y0 zW+=|WhtKf2@ZD}zH}7OedJL_I!%!F2@hdW*GLYo7O~%0D0CV5Q?ck% zCAv%$X{}1p#d5OJXusmeX8J+o@sPXMM~4dcAjL~psXlKRSqx0}+#WUJ9hGs$w*^iW0b zAP(|+eFAA%D2$n|;5l+bs#uCw%NLi{Pl9G^C;}y$EbYDQD1KujdE75vr zG_;%55IsmM@2m{zX`&G2TbcB!uR_sjStYB2_WKlXXui=Eo%tS&Km_p~XYgWh`A1HilddrCd3=asA)U{&{+PYf@Xmm@QGe zURYmubiy_J;)ajT9K6<$lAQh2b3IP4nmy*c`-|_M+%)Ue<$bojym`m{>u^cxWAgm( zce_Y(V2~94Kd)S*5d}qu3slB4+cb_+K z?OktLr<^>;1 zOJ9{Svu@I{N6Sq^esjR&8QV~z?6_xF6}#l6gwIya9=Uu3U3v7We|Du_erfD)Q{Hb` znL90YQsRt`cl+;OjSm;AuCxO~5?)GT=~_No%1qy9v0iY_Vz*D6duZLfbJt4TOOAU2 z-+sPpWbui3XUxp@KWuJld+f%%9)o)4yv0p!Zl~6qGzqA7~5&!@I literal 0 Hc-jL100001 diff --git a/tests/run-debuginfod-seekable.sh b/tests/run-debuginfod-seekable.sh new file mode 100755 index 000000000..4dd3b71e6 --- /dev/null +++ b/tests/run-debuginfod-seekable.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash + +. $srcdir/debuginfod-subr.sh + +# for test case debugging, uncomment: +set -x +unset VALGRIND_CMD + +mkdir R Z +cp -rvp ${abs_srcdir}/debuginfod-rpms/seekable-xz R +cp -rvp ${abs_srcdir}/debuginfod-debs/seekable-xz D + +# 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=14100 +get_ports + +DB=${PWD}/.debuginfod_tmp.sqlite +tempfiles $DB +export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache + +env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE \ + -d $DB -p $PORT1 -t0 -g0 \ + --fdcache-mbs=100 --fdcache-mintmp=0 --fdcache-prefetch=0 \ + -R -U R D > vlog$PORT1 2>&1 & +PID1=$! +tempfiles vlog$PORT1 +errfiles vlog$PORT1 + +wait_ready $PORT1 'ready' 1 +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 + +# Mapping from build ID to sha256 of executable and debuginfo files. Generated with: +# +# #/bin/bash +# set -e +# +# tmpdir="$(mktemp -d)" +# trap 'rm -rf "$tmpdir"' EXIT +# mkdir "$tmpdir/rpm" "$tmpdir/deb" +# rpm2cpio tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-1.0-1.x86_64.rpm | cpio -D "$tmpdir/rpm" -id --quiet +# rpm2cpio tests/debuginfod-rpms/seekable-xz/compressme-seekable-xz-debuginfo-1.0-1.x86_64.rpm | cpio -D "$tmpdir/rpm" -id --quiet +# ar p tests/debuginfod-debs/seekable-xz/compressme-seekable-xz_1.0-1_amd64.deb data.tar.xz | tar -C "$tmpdir/deb" -xJ +# ar p tests/debuginfod-debs/seekable-xz/compressme-seekable-xz-dbgsym_1.0-1_amd64.deb data.tar.xz | tar -C "$tmpdir/deb" -xJ +# +# echo "declare -A files=(" +# for which in rpm deb; do +# cd "$tmpdir/$which/usr/bin" +# echo " # $which" +# for file in $(ls -v); do +# build_id="$(eu-readelf -n "$file" | sed -n 's/^.*Build ID: \([a-f0-9]\+\).*$/\1/p')" +# executable_sha="$(sha256sum "$file" | cut -d' ' -f1)" +# debuginfo_sha="$(sha256sum "../../usr/lib/debug/.build-id/${build_id:0:2}/${build_id:2}.debug" | cut -d' ' -f1)" +# echo " [$build_id]=\"$executable_sha $debuginfo_sha\" # $file" +# done +# done +# echo ")" +declare -A files=( + # rpm + [3a54b25d643025aa69d33f08f1ddeee42b63b0c7]="7e8f2bb564e1a74f1fb0344b2218ee5dd885a84885d850846980d1e7e56d8b8b 4421819cac8118e56f9fe2fa6f3becb209b115c6eb2906ed54935f970034315c" # compressme1 + [aa1dd872c917955a95be7943219a4c58886dc965]="e38b0b8494c5cb7816394c00e9c80333262d28b368c8eff59397981435e401b4 101f46d227db71ec8c080de08fd93750a976299a81a2397f6f3b19c0771e138a" # compressme2 + [c80ba826295ca18732ddc15474f166c50c81fc51]="7b1fbbe1d702770d8fa22610a9463c41c7dee8d21fce167a9a1b0588bf82f516 49962d52bd736b63975ade48f52b5431fa7f478baf102b12bbb9efce8c5ef0ba" # compressme3 + [f8617b5ea038d166417357779f6c17dec8b80690]="4bc682ee3194ed9d2efb92e828a9f6ff3c7b0f25cb5ba94832250e79261ada8b eec384c131ce68eeb8026168a6888e3acb2fbf0d60fe808ddbe0e342eabf74a9" # compressme4 + [34880de6319ba33c23c1b1c25e454abf5ec9c433]="c83e1ed93fe09b3850368bff92ed9d4e5807515920126db71bdefc25cc3cb617 7fde181eb2ecd79be1b8aa8c5929454df5bf6c91c96e458b7c36df8da9cc640b" # compressme5 + [1be17d4e02bcf6059481e9591881c6ef2d24b795]="94037ba19019ea1be06ffa20f4d9e7cc58faf7af90c4554a657395fcc86e3c3f 6e0c3b6c5daa824f30ea95587e8e3c051bebd0eca883f8cdeada5190e8c1d4cd" # compressme6 + [be3a4ca9a68fc2b200fe5acbb12f0c5b8c761b69]="c16ac0ccde84cd8f89eebec8c29ce783a7da5c5730c76393774925487e6511f7 34b08a88f131cc9d4f7f1053b26dd277956eb18a47420aa1ac8d35c99c23d574" # compressme7 + [d64dd065e26a876c79f9ce640e107075263e4595]="53ab9909861aa77eb5cb5e7d62e2882f733861fcaf5c2421800758e52c1e0dea 3d2e3a6ddd7673acaf0573f39f0cc52d95a1b52a080d34efcc02d85e788c148e" # compressme8 + [28cc53dd47f9d12673d97ab38f6a21bcad3a528f]="9c231d8ea65133479eed17425e1d3b355703bcd0bf3dfc80520e25ffdc6d5d78 79aa232366e99bcbf4adf8ee74b333979d9164f45ad6ba55abb0e85be2ccd079" # compressme9 + [a05381ea7253b6b446e2120cab2fef08445612a3]="a66b503b4decade17b1551ef82b380c1506713b36a78c776d12d9c3863a4115a 0a6d59c228e74d485e9b314cb7e1f718267103d2c179efac89e874f7b852bbec" # compressme10 + # deb + [f2d910ae1e3e3fa717ef202120966ee4dba07ebd]="e16a38135865eff8f26b5ddfdd5719ba4b90d233f469fb07428cc6ef299214e9 047f7ec51840f6cf6977d6253ccd503f2ce2711813a53317b81e79d20452fd38" # compressme1 + [65e773f11929c579b90923ea81f36523ce2337e6]="00e2fac30ba6c494473fdba1e5ccb0cdbf12229581d2f95af519c9550af5d3d6 eee11a8c840623093de5a1518e673e50141df42e18ea1933c78edf7f11742427" # compressme2 + [a679eaf745a6da111041d208cdeb4474192c2e50]="194b79bcab83fa8140ccbee6cc199f233b0e8804b4a2231695f3c7c4604b67b4 684ff9ad385ab15a066ad4bfc3074df15f1525580310202150d7043513e9890b" # compressme3 + [8b117108d9b7f6ffce251421bdf6c6cc8c801d35]="edf8fec536efb1d9cfb534fd67c12a35b60fdb5955d3f9119ef664818fef0b22 1ef9d762fe59b03547ac7baa5596e13a4bfa8322bbdd8400987f8a95a4d038a6" # compressme4 + [2269081378c82ff119d0f0ec8cdaba3977746835]="77a5b384554a32c73f528abfd196c05c5eca6b97c948ebdccbd6d1beb441105b d29dc24c52cde04397f874660e0980f2d4a043ff132c019d0f92b238012ab464" # compressme5 + [d0840f88ceb63f52354c0b4dceda6c5011155bbd]="523c2c1c4176149a2d773307e5de520195195020bf0f2e42eb47b958b2fbdb93 170a684806ff7e55938d3afa02095a6bdd3184b62b8efdfebb72bb85bfc4120b" # compressme6 + [8101300d5d590b434b798c3edda0908346230cef]="878b7b8cedca8fb69ebc8bc3cb635a7ce0dd4b4da787cde18ff7d06503105c73 86d2cd52026cba35114201d3a1fc2ce31b2403d91785dad5366b5a5b9fe3636f" # compressme7 + [b8755c57a65fe12fa210f216dd861cf2b5101918]="2ec562f19b5b57036b48cd1f07d2d61c6a5a91b0470d14393b8c11429753d632 1ee7340245db704a0e3d5f7431706e14e7feeb9ba5c6572e61287b24b0e9fca0" # compressme8 + [ffe01fd7b7d994d9b9d9e9311ac5189d82162ba0]="cf129420e315943b9d63891455aae7fb69189158b66eba82faf1580e763aa642 3a73ccbd08a6a4088355e973bd4748d99c56b3557b12417e4fa34ed9e85c85a9" # compressme9 + [dd25b00a86c89feaf5ba61fd9c6dc8bd9e5aebef]="5bd04cadb7bce5ca3f817b84c734639764046365a96a0bc1870ecc480e7c38a9 08f9da5788224b8cfdc3bd91b784d1f9a109780100a71f6fbe0b52ec43ea436e" # compressme10 +) + +which=(executable debuginfo) +check_all() { + local port="$1" + for build_id in "${!files[@]}"; do + sha=(${files["$build_id"]}) + # Check the executable and the debuginfo. + for ((i = 0; i < 2; i++)); do + # Check each one twice to test the fdcache. + for ((j = 0; j < 2; j++)); do + path="$(env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS=http://localhost:$port ${abs_builddir}/../debuginfod/debuginfod-find "${which[$i]}" "$build_id")" + sha256sum --check - << EOF +${sha[$i]} $path +EOF + rm -f "$path" + done + done + done +} + +check_all $PORT1 + +# Make sure all extractions used the seekable optimization. +curl -s http://localhost:$PORT1/metrics | awk ' +/^http_responses_total\{result="seekable xz archive"\}/ { + print + seekable = $NF +} + +/^http_responses_total\{result="archive fdcache"\}/ { + print + fdcache = $NF +} + +/^http_responses_total\{result="(rpm|deb) archive"\}/ { + print + full = $NF +} + +END { + if (seekable == 0) { + print "error: no seekable extractions" > "/dev/stderr" + exit 1 + } + if (fdcache == 0) { + print "error: no fdcache hits" > "/dev/stderr" + exit 1 + } + if (full > 0) { + print "error: " full " full extractions" > "/dev/stderr" + exit 1 + } +}' + +tempfiles $DB* + +kill $PID1 +wait $PID1 +PID1=0 + +exit 0 -- 2.47.2