Skip to content

Commit

Permalink
git-svn: reduce check_cherry_pick cache overhead
Browse files Browse the repository at this point in the history
We do not need to store entire lists of commits, only the
number of incomplete and the first commit for reference.
This reduces the amount of data we need to store in memory
and on disk stores.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
  • Loading branch information
Eric Wong committed Oct 24, 2014
1 parent 9ee13a9 commit d0b34f2
Showing 1 changed file with 15 additions and 13 deletions.
28 changes: 15 additions & 13 deletions perl/Git/SVN.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1537,7 +1537,7 @@ sub _rev_list {
@rv;
}

sub check_cherry_pick {
sub check_cherry_pick2 {
my $base = shift;
my $tip = shift;
my $parents = shift;
Expand All @@ -1552,7 +1552,8 @@ sub check_cherry_pick {
delete $commits{$commit};
}
}
return (keys %commits);
my @k = (keys %commits);
return (scalar @k, $k[0]);
}

sub has_no_changes {
Expand Down Expand Up @@ -1597,7 +1598,7 @@ sub tie_for_persistent_memoization {
mkpath([$cache_path]) unless -d $cache_path;

my %lookup_svn_merge_cache;
my %check_cherry_pick_cache;
my %check_cherry_pick2_cache;
my %has_no_changes_cache;
my %_rev_list_cache;

Expand All @@ -1608,11 +1609,11 @@ sub tie_for_persistent_memoization {
LIST_CACHE => ['HASH' => \%lookup_svn_merge_cache],
;

tie_for_persistent_memoization(\%check_cherry_pick_cache,
"$cache_path/check_cherry_pick");
memoize 'check_cherry_pick',
tie_for_persistent_memoization(\%check_cherry_pick2_cache,
"$cache_path/check_cherry_pick2");
memoize 'check_cherry_pick2',
SCALAR_CACHE => 'FAULT',
LIST_CACHE => ['HASH' => \%check_cherry_pick_cache],
LIST_CACHE => ['HASH' => \%check_cherry_pick2_cache],
;

tie_for_persistent_memoization(\%has_no_changes_cache,
Expand All @@ -1636,7 +1637,7 @@ sub tie_for_persistent_memoization {
$memoized = 0;

Memoize::unmemoize 'lookup_svn_merge';
Memoize::unmemoize 'check_cherry_pick';
Memoize::unmemoize 'check_cherry_pick2';
Memoize::unmemoize 'has_no_changes';
Memoize::unmemoize '_rev_list';
}
Expand All @@ -1648,7 +1649,8 @@ sub tie_for_persistent_memoization {
return unless -d $cache_path;

for my $cache_file (("$cache_path/lookup_svn_merge",
"$cache_path/check_cherry_pick",
"$cache_path/check_cherry_pick", # old
"$cache_path/check_cherry_pick2",
"$cache_path/has_no_changes")) {
for my $suffix (qw(yaml db)) {
my $file = "$cache_file.$suffix";
Expand Down Expand Up @@ -1817,15 +1819,15 @@ sub find_extra_svn_parents {
}

# double check that there are no missing non-merge commits
my (@incomplete) = check_cherry_pick(
my ($ninc, $ifirst) = check_cherry_pick2(
$merge_base, $merge_tip,
$parents,
@all_ranges,
);

if ( @incomplete ) {
warn "W:svn cherry-pick ignored ($spec) - missing "
.@incomplete." commit(s) (eg $incomplete[0])\n";
if ($ninc) {
warn "W:svn cherry-pick ignored ($spec) - missing " .
"$ninc commit(s) (eg $ifirst)\n";
} else {
warn
"Found merge parent ($spec): ",
Expand Down

0 comments on commit d0b34f2

Please sign in to comment.