]> Sergey Matveev's repositories - public-inbox.git/commitdiff
index: "git log" failures are fatal
authorEric Wong <e@80x24.org>
Mon, 4 Nov 2019 00:43:14 +0000 (00:43 +0000)
committerEric Wong <e@80x24.org>
Mon, 4 Nov 2019 02:06:41 +0000 (02:06 +0000)
While I've never seen "git log" fail on its own, it could happen
one day and we should be prepared to abort indexing when it
happens.

Beef up tests for t/spawn.t to ensure close() behaves
on popen_rd the way we expect it to.

lib/PublicInbox/SearchIdx.pm
lib/PublicInbox/V2Writable.pm
t/spawn.t

index b2d71a1f88b462493d3db527c609d00f4e16b31b..f265fa7f27ae7ed3cb0baa7f8e4fd7215adb3e9d 100644 (file)
@@ -590,6 +590,7 @@ sub read_log {
                        $newest ||= $latest;
                }
        }
+       close($log) or die "git log failed: \$?=$?";
        # get the leftovers
        foreach my $blob (keys %D) {
                my $mime = do_cat_mail($git, $blob, \$bytes) or next;
@@ -632,7 +633,7 @@ sub _git_log {
                             --no-notes --no-color --no-renames
                             --diff-filter=AM), $range);
        ++$fcount while <$fh>;
-       close $fh;
+       close $fh or die "git log failed: \$?=$?";
        my $high = $self->{mm}->num_highwater;
        $pr->("$fcount\n") if $pr; # continue previous line
        $self->{ntodo} = $fcount;
@@ -713,7 +714,10 @@ sub _index_sync {
        my $xdb = $self->begin_txn_lazy;
        my $mm = _msgmap_init($self);
        do {
-               $xlog = undef;
+               if ($xlog) {
+                       close($xlog) or die "git log failed: \$?=$?";
+                       $xlog = undef;
+               }
                $last_commit = _last_x_commit($self, $mm);
                $lx = reindex_from($opts->{reindex}, $last_commit);
 
index 1825da2cf69f6ed2dc87ab8ea15b9bb1343e3308..02f313b022c01dc7a52140016a4b1715a20f0f37 100644 (file)
@@ -1128,6 +1128,7 @@ sub sync_prepare ($$$) {
                                --no-notes --no-color --no-renames
                                --diff-filter=AM), $range, '--', 'm');
                ++$n while <$fh>;
+               close $fh or die "git log failed: \$?=$?";
                $pr->("$n\n") if $pr;
                $regen_max += $n;
        }
@@ -1195,7 +1196,7 @@ sub unindex ($$$$) {
                unindex_oid($self, $git, $1, $unindexed);
        }
        delete $self->{reindex_pipe};
-       $fh = undef;
+       close $fh or die "git log failed: \$?=$?";
 
        return unless $sync->{-opt}->{prune};
        my $after = scalar keys %$unindexed;
@@ -1251,7 +1252,7 @@ sub index_epoch ($$$) {
                        mark_deleted($self, $sync, $git, $1);
                }
        }
-       $fh = undef;
+       close $fh or die "git log failed: \$?=$?";
        delete $self->{reindex_pipe};
        update_last_commit($self, $git, $i, $cmt) if defined $cmt;
 }
index aba1a26c7ce66e6571511196d5bcb5b743fe78ee..ebebfb57eafc078577c4b79bc6021fce8d6c4846 100644 (file)
--- a/t/spawn.t
+++ b/t/spawn.t
@@ -71,13 +71,13 @@ use PublicInbox::Spawn qw(which spawn popen_rd);
        is($buf, "hello\n", 'tied gets works');
        is(sysread($fh, $buf, 6), 0, 'sysread got EOF');
        $? = 1;
-       close $fh;
+       ok(close($fh), 'close succeeds');
        is($?, 0, '$? set properly');
 }
 
 {
        my $fh = popen_rd([qw(false)]);
-       close $fh;
+       ok(!close($fh), 'close fails on false');
        isnt($?, 0, '$? set properly: '.$?);
 }