As with mail search, a cindex may be updated while WWW is
serving requests.  Thus we must reopen the Xapian DB when
the revision we're using becomes stale.
---
 lib/PublicInbox/CodeSearch.pm | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/lib/PublicInbox/CodeSearch.pm b/lib/PublicInbox/CodeSearch.pm
index f4694686..a2f4bae8 100644
--- a/lib/PublicInbox/CodeSearch.pm
+++ b/lib/PublicInbox/CodeSearch.pm
@@ -256,17 +256,22 @@ sub load_ct { # retry_reopen cb
        }
 }
 
+sub load_ct { # retry_reopen cb
+       my ($self, $git_dir) = @_;
+       my @ids = docids_of_git_dir $self, $git_dir or return;
+       for (@ids) {
+               my $doc = $self->get_doc($_) // next;
+               return int_val($doc, CT);
+       }
+}
+
 sub load_commit_times { # each_cindex callback
        my ($self, $todo) = @_; # todo = [ [ time, git ], [ time, git ] ...]
-       my (@pending, $rec, $dir, @ids, $doc);
+       my (@pending, $rec, $ct);
        while ($rec = shift @$todo) {
-               @ids = docids_of_git_dir $self, $rec->[1]->{git_dir};
-               if (@ids) {
-                       for (@ids) {
-                               $doc = $self->get_doc($_) // next;
-                               $rec->[0] = int_val($doc, CT);
-                               last;
-                       }
+               $ct = $self->retry_reopen(\&load_ct, $rec->[1]->{git_dir});
+               if (defined $ct) {
+                       $rec->[0] = $ct;
                } else { # may be in another cindex:
                        push @pending, $rec;
                }
@@ -295,7 +300,7 @@ EOM
                        $git;
                };
        }
-       my $jd = join_data($self) or return warn <<EOM;
+       my $jd = $self->retry_reopen(\&join_data, $self) or return warn <<EOM;
 W: cindex.$name.topdir=$self->{topdir} has no usable join data for $cfg_f
 EOM
        my ($ekeys, $roots, $ibx2root) = @$jd{qw(ekeys roots ibx2root)};
@@ -366,7 +371,7 @@ sub repos_sorted {
        my @recs = map { [ 0, $_ ] } @_; # PublicInbox::Git objects
        my @todo = @recs;
        $pi_cfg->each_cindex(\&load_commit_times, \@todo);
-       @recs = sort { $b->[0] <=> $a->[0] } @recs;
+       @recs = sort { $b->[0] <=> $a->[0] } @recs; # sort by commit time
 }
 
 1;

Reply via email to