]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/V2Writable.pm
v2writable: drop "EPOCH.git indexing $RANGE" progress
[public-inbox.git] / lib / PublicInbox / V2Writable.pm
index 04c91e5dd3b77b44db3f974357e49aad4f538901..2ff2fc2597f525af9f3a8f8937820abb8594c95d 100644 (file)
@@ -22,7 +22,7 @@ use PublicInbox::SearchIdx;
 use IO::Handle; # ->autoflush
 use File::Temp qw(tempfile);
 
-my $x40 = qr/[a-f0-9]{40}/;
+my $OID = qr/[a-f0-9]{40,}/;
 # an estimate of the post-packed size to the raw uncompressed size
 my $PACKING_FACTOR = 0.4;
 
@@ -492,7 +492,7 @@ sub git_hash_raw ($$) {
        local $/ = "\n";
        chomp(my $oid = <$r>);
        close $r or die "git hash-object failed: $?";
-       $oid =~ /\A[a-f0-9]{40}\z/ or die "OID not expected: $oid";
+       $oid =~ /\A$OID\z/ or die "OID not expected: $oid";
        $oid;
 }
 
@@ -564,8 +564,8 @@ W: $list
                        num => $smsg->{num},
                        mid => $smsg->{mid},
                }, 'PublicInbox::Smsg';
-               my $v2w = { autime => $smsg->{ds}, cotime => $smsg->{ts} };
-               $new_smsg->populate($new_mime, $v2w);
+               my $sync = { autime => $smsg->{ds}, cotime => $smsg->{ts} };
+               $new_smsg->populate($new_mime, $sync);
                do_idx($self, \$raw, $new_mime, $new_smsg);
        }
        $rewritten->{rewrites};
@@ -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 {;
@@ -951,7 +950,7 @@ sub reindex_oid ($$$$) {
                blob => $oid,
                mid => $mid0,
        }, 'PublicInbox::Smsg';
-       $smsg->populate($mime, $self);
+       $smsg->populate($mime, $sync);
        if (do_idx($self, $msgref, $mime, $smsg)) {
                reindex_checkpoint($self, $sync, $git);
        }
@@ -1046,17 +1045,17 @@ sub prepare_range_stack {
                                $range);
        my ($at, $ct, $stk);
        while (<$fh>) {
-               if (/\A([0-9]+)-([0-9]+)-($x40)$/o) {
+               if (/\A([0-9]+)-([0-9]+)-($OID)$/o) {
                        ($at, $ct) = ($1 + 0, $2 + 0);
                        $stk //= PublicInbox::IdxStack->new($3);
-               } elsif (/\A:\d{6} 100644 $x40 ($x40) [AM]\td$/o) {
+               } elsif (/\A:\d{6} 100644 $OID ($OID) [AM]\td$/o) {
                        my $oid = $1;
                        if ($D) { # reindex case
                                $D->{pack('H*', $oid)}++;
                        } else { # non-reindex case:
                                $stk->push_rec('d', $at, $ct, $oid);
                        }
-               } elsif (/\A:\d{6} 100644 $x40 ($x40) [AM]\tm$/o) {
+               } elsif (/\A:\d{6} 100644 $OID ($OID) [AM]\tm$/o) {
                        my $oid = $1;
                        if ($D) {
                                my $oid_bin = pack('H*', $oid);
@@ -1096,8 +1095,6 @@ sub sync_prepare ($$$) {
 
                next if $?; # new repo
                my $range = log_range($self, $sync, $git, $i, $tip) or next;
-               $sync->{ranges}->[$i] = $range;
-
                # can't use 'rev-list --count' if we use --diff-filter
                $pr->("$i.git counting $range ... ") if $pr;
                my $stk = prepare_range_stack($git, $sync, $range);
@@ -1178,7 +1175,7 @@ sub unindex ($$$$) {
                        --no-notes --no-color --no-abbrev --no-renames);
        my $fh = $self->{reindex_pipe} = $git->popen(@cmd, $unindex_range);
        while (<$fh>) {
-               /\A:\d{6} 100644 $x40 ($x40) [AM]\tm$/o or next;
+               /\A:\d{6} 100644 $OID ($OID) [AM]\tm$/o or next;
                unindex_oid($self, $git, $1, $unindexed);
        }
        delete $self->{reindex_pipe};
@@ -1213,28 +1210,23 @@ 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);
        }
        defined(my $stk = $sync->{stacks}->[$i]) or return;
        $sync->{stacks}->[$i] = undef;
-       my $range = $sync->{ranges}->[$i];
-       if (my $pr = $sync->{-opt}->{-progress}) {
-               $pr->("$i.git indexing $range\n");
-       }
        while (my ($f, $at, $ct, $oid) = $stk->pop_rec) {
                $self->{current_info} = "$i.git $oid";
                if ($f eq 'm') {
-                       $self->{autime} = $at;
-                       $self->{cotime} = $ct;
+                       $sync->{autime} = $at;
+                       $sync->{cotime} = $ct;
                        reindex_oid($self, $sync, $git, $oid);
                } elsif ($f eq 'd') {
                        unindex_oid($self, $git, $oid);
                }
        }
-       delete @$self{qw(autime cotime)};
+       delete @$sync{qw(autime cotime)};
        update_last_commit($self, $git, $i, $stk->{latest_cmt});
 }
 
@@ -1247,6 +1239,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