Re: [PATCH v9 1/9] tmp-objdir: new API for creating temporary writable databases

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 30, 2021 at 1:27 PM Elijah Newren <newren@xxxxxxxxx> wrote:
>
> On Mon, Nov 15, 2021 at 3:51 PM Neeraj Singh via GitGitGadget
> <gitgitgadget@xxxxxxxxx> wrote:
> >
> > From: Neeraj Singh <neerajsi@xxxxxxxxxxxxx>
> >
> > The tmp_objdir API provides the ability to create temporary object
> > directories, but was designed with the goal of having subprocesses
> > access these object stores, followed by the main process migrating
> > objects from it to the main object store or just deleting it.  The
> > subprocesses would view it as their primary datastore and write to it.
> >
> > Here we add the tmp_objdir_replace_primary_odb function that replaces
> > the current process's writable "main" object directory with the
> > specified one. The previous main object directory is restored in either
> > tmp_objdir_migrate or tmp_objdir_destroy.
> >
> > For the --remerge-diff usecase, add a new `will_destroy` flag in `struct
> > object_database` to mark ephemeral object databases that do not require
> > fsync durability.
> >
> > Add 'git prune' support for removing temporary object databases, and
> > make sure that they have a name starting with tmp_ and containing an
> > operation-specific name.
> >
> > Based-on-patch-by: Elijah Newren <newren@xxxxxxxxx>
> >
> > Signed-off-by: Neeraj Singh <neerajsi@xxxxxxxxxxxxx>
> > Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx>
> > ---
> >  builtin/prune.c        | 23 +++++++++++++++---
> >  builtin/receive-pack.c |  2 +-
> >  environment.c          |  5 ++++
> >  object-file.c          | 44 +++++++++++++++++++++++++++++++--
> >  object-store.h         | 19 +++++++++++++++
> >  object.c               |  2 +-
> >  tmp-objdir.c           | 55 +++++++++++++++++++++++++++++++++++++++---
> >  tmp-objdir.h           | 29 +++++++++++++++++++---
> >  8 files changed, 165 insertions(+), 14 deletions(-)
> >
> > diff --git a/builtin/prune.c b/builtin/prune.c
> > index 485c9a3c56f..a76e6a5f0e8 100644
> > --- a/builtin/prune.c
> > +++ b/builtin/prune.c
> > @@ -18,6 +18,7 @@ static int show_only;
> >  static int verbose;
> >  static timestamp_t expire;
> >  static int show_progress = -1;
> > +static struct strbuf remove_dir_buf = STRBUF_INIT;
> >
> >  static int prune_tmp_file(const char *fullpath)
> >  {
> > @@ -26,10 +27,20 @@ static int prune_tmp_file(const char *fullpath)
> >                 return error("Could not stat '%s'", fullpath);
> >         if (st.st_mtime > expire)
> >                 return 0;
> > -       if (show_only || verbose)
> > -               printf("Removing stale temporary file %s\n", fullpath);
> > -       if (!show_only)
> > -               unlink_or_warn(fullpath);
> > +       if (S_ISDIR(st.st_mode)) {
> > +               if (show_only || verbose)
> > +                       printf("Removing stale temporary directory %s\n", fullpath);
> > +               if (!show_only) {
> > +                       strbuf_reset(&remove_dir_buf);
> > +                       strbuf_addstr(&remove_dir_buf, fullpath);
> > +                       remove_dir_recursively(&remove_dir_buf, 0);
>
> Why not just define remove_dir_buf here rather than as a global?  It'd
> not only make the code more readable by keeping everything localized,
> it would have prevented the forgotten strbuf_reset() bug from the
> earlier round of this patch.
>
> Sure, that'd be an extra memory allocation/free for each directory you
> hit, which should be negligible compared to the cost of
> remove_dir_recursively()...and I'm not sure this is performance
> critical anyway (I don't see why we'd expect more than O(1) cruft
> temporary directories).

I'll take this suggestion.

> > +               }
> > +       } else {
> > +               if (show_only || verbose)
> > +                       printf("Removing stale temporary file %s\n", fullpath);
> > +               if (!show_only)
> > +                       unlink_or_warn(fullpath);
> > +       }
> >         return 0;
> >  }
> >
> > @@ -97,6 +108,9 @@ static int prune_cruft(const char *basename, const char *path, void *data)
> >
> >  static int prune_subdir(unsigned int nr, const char *path, void *data)
> >  {
> > +       if (verbose)
>
> Shouldn't this be
>     if (show_only || verbose)
> ?

Doing that breaks one of the tests, since we print extra stuff that's
unexpected. I think I'm going to just revert this change, since it
appears that we call this callback and try to remove the directory
even if it's non-empty.

Do you have any comments or thoughts on how we want to allow the user
to configure fsync settings?

Thanks,
Neeraj



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux