Re: [PATCH] git-svn: Destroy the cache when we fail to read it

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

 



1) Sure.  I'm not sure whether I should make $cache_path toplevel, or
a parameter of do_memoization.  I'm thinking the latter, just in case
$ENV{GIT_DIR} changes between calls to
memoize_svn_mergeinfo_functions?

2) I'm not sure if there's a clean/robust way to detect cache
corruption; if it's completely corrupted, Storable complains about not
finding the right magic number, but I could imagine things being
corrupted in more subtle ways that give rise to other Storable errors.
As for your worry: I don't know the code well enough to have git-svn
recover from some other error in memoization; if there's an error,
that means that it can't read the cache correctly (either in tieing
the hashes, or in memoizing the functions).  The other alternative
that I see is to die.  Is this preferable to repeatedly discarding the
cache?

3) Will fix.

4) Will do.

I'll send a new patch in once I hear back from you about 1 and 2.

-Jason

On Mon, Aug 22, 2011 at 10:27 PM, Jonathan Nieder <jrnieder@xxxxxxxxx> wrote:
>
> (+cc: Eric Wong)
> Hi Jason,
>
> Jason Gross wrote:
>
> [This patch teaches "git svn" to invalidate caches when they
>  fail to load, for example because the endianness or size of
>  some type changed, which is common in the perl 5.6 -> 5.8
>  upgrade.]
>
> > http://lists.debian.org/debian-perl/2011/05/msg00023.html and
> > http://lists.debian.org/debian-perl/2011/05/msg00026.html).
> [...]
> > --- a/git-svn.perl
> > +++ b/git-svn.perl
> > @@ -1680,7 +1680,7 @@ use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent
> >              $_use_svnsync_props $no_reuse_existing $_minimize_url
> >           $_use_log_author $_add_author_from $_localtime/;
> >  use Carp qw/croak/;
> > -use File::Path qw/mkpath/;
> > +use File::Path qw/mkpath rmtree/;
> >  use File::Copy qw/copy/;
> >  use IPC::Open3;
> >  use Memoize;  # core since 5.8.0, Jul 2002
> > @@ -3198,28 +3198,41 @@ sub has_no_changes {
> >               $memoized = 1;
> >
> >               my $cache_path = "$ENV{GIT_DIR}/svn/.caches/";
> > -             mkpath([$cache_path]) unless -d $cache_path;
> > -
> > -             tie my %lookup_svn_merge_cache => 'Memoize::Storable',
> [...]
> > -             ;
> > +             my $do_memoization = sub {
> > +                     mkpath([$cache_path]) unless -d $cache_path;
> [...]
> > +                     ;
> > +             };
> > +
> > +             if (not eval {
> > +                     $do_memoization->();
> > +                     1;
> > +             }) {
> > +                     my $err = $@ || "Zombie error"; # "Zombie error" to catch clobbered $@ in buggy destructors
> > +                     die $err unless -d $cache_path;
> > +                     print STDERR "Discarding cache and trying again ($@)\n";
> > +                     rmtree([$cache_path]);
> > +                     $do_memoization->();
> > +             }
>
> Thank you thank you thank you.
>
> Okay, time for nitpicks:
>
>  1) Would it be possible to lift this do_memoization() to a toplevel sub?
>    I suspect that could make the code a little easier to read.
>
>  2) Is it important to discard the cache for _all_ errors, instead
>    of just corruption and "is not compatible" errors?  Rebuilding the
>    cache is not cheap, and I am afraid of effects like repeatedly
>    discarding the cache only to rebuild it again due to a typo in
>    git-svn.perl or an out-of-memory condition.
>
>  3) The line with "Zombie error" is very long --- I guess putting the
>    comment on the line before would help.
>
>  4) The series would be clearer imho as a single patch that includes
>    both the fix and tests.
>
> Eric, what do you think?
>
> Thanks again, :)
> Jonathan
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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]