git-svn: cache only mergeinfo revisions

This should reduce excessive memory usage from the new mergeinfo
caches without hurting performance too much, assuming reasonable
latency to the SVN server.

Cc: Hin-Tak Leung <htl10@users.sourceforge.net>
Suggested-by: Jakob Stoklund Olesen <stoklund@2pi.dk>
Signed-off-by: Eric Wong <normalperson@yhbt.net>
maint
Eric Wong 2014-10-20 01:02:53 +00:00
parent d0b34f241d
commit 54b95346c1
1 changed files with 8 additions and 14 deletions

View File

@ -1713,13 +1713,10 @@ sub mergeinfo_changes {
# Initialize cache on the first call. # Initialize cache on the first call.
unless (defined $self->{cached_mergeinfo_rev}) { unless (defined $self->{cached_mergeinfo_rev}) {
$self->{cached_mergeinfo_rev} = {}; $self->{cached_mergeinfo_rev} = {};
$self->{cached_mergeinfo} = {};
} }


my $cached_rev = $self->{cached_mergeinfo_rev}{$old_path}; my $cached_rev = $self->{cached_mergeinfo_rev}{$old_path};
if (defined $cached_rev && $cached_rev == $old_rev) { unless (defined $cached_rev && $cached_rev == $old_rev) {
$old_minfo = $self->{cached_mergeinfo}{$old_path};
} else {
my $ra = $self->ra; my $ra = $self->ra;
# Give up if $old_path isn't in the repo. # Give up if $old_path isn't in the repo.
# This is probably a merge on a subtree. # This is probably a merge on a subtree.
@ -1728,19 +1725,16 @@ sub mergeinfo_changes {
"directory didn't exist in r$old_rev\n"; "directory didn't exist in r$old_rev\n";
return {}; return {};
} }
my (undef, undef, $props) =
$self->ra->get_dir($old_path, $old_rev);
if (defined $props->{"svn:mergeinfo"}) {
my %omi = map {split ":", $_ } split "\n",
$props->{"svn:mergeinfo"};
$old_minfo = \%omi;
}
$self->{cached_mergeinfo}{$old_path} = $old_minfo;
$self->{cached_mergeinfo_rev}{$old_path} = $old_rev;
} }
my (undef, undef, $props) = $self->ra->get_dir($old_path, $old_rev);
if (defined $props->{"svn:mergeinfo"}) {
my %omi = map {split ":", $_ } split "\n",
$props->{"svn:mergeinfo"};
$old_minfo = \%omi;
}
$self->{cached_mergeinfo_rev}{$old_path} = $old_rev;


# Cache the new mergeinfo. # Cache the new mergeinfo.
$self->{cached_mergeinfo}{$path} = \%minfo;
$self->{cached_mergeinfo_rev}{$path} = $rev; $self->{cached_mergeinfo_rev}{$path} = $rev;


my %changes = (); my %changes = ();