]> Sergey Matveev's repositories - public-inbox.git/commitdiff
v2writable: index_sync: reduce fill_alternates calls
authorEric Wong <e@yhbt.net>
Fri, 24 Jul 2020 05:55:50 +0000 (05:55 +0000)
committerEric Wong <e@yhbt.net>
Sat, 25 Jul 2020 20:48:18 +0000 (20:48 +0000)
Instead of doing fill_alternates for every epoch we're indexing,
just do it once at the start of index_sync invocation.  This
will set us up for using a single "git cat-file" process for
indexing multiple epochs.

lib/PublicInbox/V2Writable.pm

index 04c91e5dd3b77b44db3f974357e49aad4f538901..c896dc0ed7c80e7327e87aea3fece1d2a5b1bb7c 100644 (file)
@@ -682,10 +682,7 @@ sub fill_alternates ($$) {
 
        my $pfx = "$self->{-inbox}->{inboxdir}/git";
        my $all = "$self->{-inbox}->{inboxdir}/all.git";
-
-       unless (-d $all) {
-               PublicInbox::Import::init_bare($all);
-       }
+       PublicInbox::Import::init_bare($all) unless -d $all;
        my $info_dir = "$all/objects/info";
        my $alt = "$info_dir/alternates";
        my (%alt, $new);
@@ -695,7 +692,9 @@ sub fill_alternates ($$) {
                $mode = (stat($fh))[2] & 07777;
 
                # we assign a sort score to every alternate and favor
-               # the newest (highest numbered) one when we
+               # the newest (highest numbered) one because loose objects
+               # require scanning epochs and only the latest epoch is
+               # expected to see loose objects
                my $score;
                my $other = 0; # in case admin adds non-epoch repos
                %alt = map {;
@@ -1213,7 +1212,6 @@ sub index_epoch ($$$) {
        my $git_dir = git_dir_n($self, $i);
        die 'BUG: already reindexing!' if $self->{reindex_pipe};
        -d $git_dir or return; # missing epochs are fine
-       fill_alternates($self, $i);
        my $git = PublicInbox::Git->new($git_dir);
        if (my $unindex_range = delete $sync->{unindex_range}->{$i}) {
                unindex($self, $sync, $git, $unindex_range);
@@ -1247,6 +1245,7 @@ sub index_sync {
        my $latest = git_dir_latest($self, \$epoch_max);
        return unless defined $latest;
        $self->idx_init($opt); # acquire lock
+       fill_alternates($self, $epoch_max);
        $self->{over}->rethread_prepare($opt);
        my $sync = {
                unindex_range => {}, # EPOCH => oid_old..oid_new