[PATCH] debuginfod-client: default to XDG cache.
Aaron Merey
amerey@redhat.com
Fri Feb 21 17:22:00 GMT 2020
On Fri, Feb 21, 2020 at 11:13 AM Mark Wielaard <mark@klomp.org> wrote:
> On Wed, 2020-02-19 at 16:04 -0500, Aaron Merey wrote:
> > Location of client cache now defaults to $XDG_CACHE_HOME/debuginfod_client.
> > If XDG_CACHE_HOME is not set then fallback to $HOME/.cache/debuginfod_client.
> > Also maintain backwards compatibility with the previous default path-
> > if $HOME/.debuginfod_client_cache exists, use that instead of the new
> > defaults.
>
> Another option might be to rename $HOME/.debuginfod_client_cache to the
> new XDG cache debuginfod_client location. But that might be tricky if
> it crosses file systems/mount points. So then you would probably need
> to give up and fallback to what you do now if you get EXDEV from rename
> (or actually any error). Might be too much work and a little bit too
> tricky/clever...?
We can try a simple rename and fallback if there's any error. We could
mention this briefly in the man page.
> > + if (xdg != NULL && strlen (xdg) > 0)
> > + snprintf (cachedir, PATH_MAX, "%s", xdg);
> > + else
> > + snprintf (cachedir, PATH_MAX, "%s/.cache", getenv ("HOME" ?: "/"));
>
> Are these brackets correct? Maybe ..., getenv ("HOME") ?: "/");
You're right it should be getenv ("HOME") ?: "/".
> > + /* Create XDG cache directory if it doesn't exist. */
> > + if (stat (cachedir, &st) == 0)
> > + {
> > + if (! S_ISDIR (st.st_mode))
> > + {
> > + rc = -EEXIST;
> > + goto out;
> > + }
> > + }
> > + else
> > + {
> > + char *cmd;
> > +
> > + xalloc_str (cmd, "mkdir -p \'%s\'", cachedir);
> > + rc = system (cmd);
>
> Please don't use system. Use rc = mkdir (cachedir, 0700);
Sure. My goal was to have any nonexisting parent directories created as
easily as possible and I wasn't aware of anything besides `mkdir -p`.
Should we not bother creating nonexisting parent directories?
> > + free (cmd);
> > + if (rc == 0)
> > + {
> > + free (cache_path);
> > + xalloc_str (cache_path, "%s/%s", cachedir, cache_xdg_name);
> > + }
> > + else
> > + {
> > + rc = -EINVAL;
> > + goto out;
> > + }
>
> The creation of the directory might race with another client, so
> specifically test for EEXIST and then test S_ISDIR again before
> returning failure.
Ok.
> > .B $HOME/.debuginfod_client_cache
> > -Default cache directory.
> > +Default cache directory. If XDG_CACHE_HOME is not set then
> > +\fB$HOME/.cache/debuginfod_client\fP is used.
> > .PD
>
> Should we mention the old location might still be used?
> Maybe simply ignoring it is fine.
Here I could mention the possibility of a rename when using a client
cache at the old location.
> > .SH "SEE ALSO"
> > diff --git a/tests/ChangeLog b/tests/ChangeLog
> > index 1f55a291..ec081b3c 100644
> > --- a/tests/ChangeLog
> > +++ b/tests/ChangeLog
> > @@ -1,3 +1,7 @@
> > +2020-02-19 Aaron Merey <amerey@redhat.com>
> > + * run-debuginfod-find.sh: Run tests for verifying default
> > + client cache locations.
>
> Probably too much work for this patch. But it feels run-debuginfod-
> find.sh is doing a lot of different testing. Might be good to put some
> tests in their own test file.
That's a good idea for a future patch, maybe separate client and server
tests into two files (to the extent that they can be separated).
> You need to use testrun to run "test" binaries (or at least make sure
> LD_LIBRARY_PATH is setup correctly) to make sure the test environment
> is setup correctly. The above doesn't work when using srcdir!=builddir
> and testrun will make sure that valgrind is ran (as is done with make
> distcheck) when you configure with --enable-valgrind (which would have
> caught the previous small memleak).
>
> diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh
> index 317c687c..083ff59b 100755
> --- a/tests/run-debuginfod-find.sh
> +++ b/tests/run-debuginfod-find.sh
> @@ -152,14 +152,14 @@ cmp $filename ${PWD}/prog.c
> mkdir tmphome
>
> # $HOME/.cache should be created.
> -env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
> +testrun env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
> if [ ! -f $PWD/tmphome/.cache/debuginfod_client/$BUILDID/debuginfo ]; then
> echo "could not find cache in $PWD/tmphome/.cache"
> exit 1
> fi
>
> # $XDG_CACHE_HOME should take priority over $HOME.cache.
> -env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
> +testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
> if [ ! -f $PWD/tmpxdg/debuginfod_client/$BUILDID/debuginfo ]; then
> echo "could not find cache in $PWD/tmpxdg/"
> exit 1
> @@ -172,11 +172,11 @@ cp -r $DEBUGINFOD_CACHE_PATH tmphome/.debuginfod_client_cache
> # Add a file that doesn't exist in $HOME/.cache, $XDG_CACHE_HOME.
> mkdir tmphome/.debuginfod_client_cache/deadbeef
> echo ELF... > tmphome/.debuginfod_client_cache/deadbeef/debuginfo
> -filename=`env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo deadbeef`
> +filename=`testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo deadbeef`
> cmp $filename tmphome/.debuginfod_client_cache/deadbeef/debuginfo
>
> # $DEBUGINFO_CACHE_PATH should take priority over all else.
> -env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH=$PWD/tmpcache ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
> +testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH=$PWD/tmpcache ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
> if [ ! -f $PWD/tmpcache/$BUILDID/debuginfo ]; then
> echo "could not find cache in $PWD/tmpcache/"
> exit 1
Ok I'll include that.
Thanks,
Aaron
More information about the Elfutils-devel
mailing list