Download raw body.
cache pack index file list when repository is opened
On Mon, Mar 14, 2022 at 12:24:12AM +0100, Omar Polo wrote:
> Omar Polo <op@omarpolo.com> wrote:
> > Stefan Sperling <stsp@stsp.name> wrote:
> > > Profiling shows that many calls to readdir(3) of the objects/pack/
> > > directory can cause significant overhead during 'gotadmin pack -a'
> > > if the repository has many pack files that need to be searched.
> > >
> > > This patch caches the list of known pack index files when the
> > > repository is opened. This speeds up searches by skipping readdir(3)
> > > if the pack index cache cannot prevent us from hitting the disk.
> > >
> > > Pack files are not really expected to appear or disappear out
> > > of the blue while the repository is in use, even though this
> > > is possible. But even readdir(3) followed open(2) of an entry
> > > could suffer from this. If this becomes a problem it was already
> > > possible to hit with the old code, and could only be fixed by
> > > catching relevant errors and retrying.
> > >
> > > ok?
> >
> > makes sense and the diff is almost straightforward.
>
> I take back what I said, this broke at least the `send' command.
>
> % got send
> Connecting to "origin" git@omarpolo.com
> packing 1 reference; 3 objects
> Segmentation fault
>
> without leaving any core file around, and also part of the regress
> suite.
>
> (don't have time to debug right now, sorry, it's pretty late, but wanted
> to share this.)
Thanks! Not sure how this slipped through my testing, I believe I
did run the test suite on the diff.
There is an unintialized 'err' variable in the existing code.
Initializing this variable should resolve the problem:
-----------------------------------------------
commit 7114caa4e6f02478c216aa1b4dbe16f22aa38afa (search-packidx-readdir)
from: Stefan Sperling <stsp@stsp.name>
date: Mon Mar 14 13:04:27 2022 UTC
fix uninitialized error variable in find_pack_for_reuse()
diff f208811a6e934112206f1b12bd5eb1223774a5cd 3714d5a61c20ff19b836b9e8106e3d7c0a2d3476
blob - 633d93bf0e00b96fca90fbb00e8974e0c4925f37
blob + 273f38d8a8d75455bcb4a4eebf66c1d7dae0df8e
--- lib/pack_create.c
+++ lib/pack_create.c
@@ -489,7 +489,7 @@ static const struct got_error *
find_pack_for_reuse(struct got_packidx **best_packidx,
struct got_repository *repo)
{
- const struct got_error *err;
+ const struct got_error *err = NULL;
struct got_pathlist_entry *pe;
const char *best_packidx_path = NULL;
int nobj_max = 0;
cache pack index file list when repository is opened