about summary refs log tree commit homepage
path: root/lib/PublicInbox/ExtSearchIdx.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/ExtSearchIdx.pm')
-rw-r--r--lib/PublicInbox/ExtSearchIdx.pm20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/PublicInbox/ExtSearchIdx.pm b/lib/PublicInbox/ExtSearchIdx.pm
index 2cdc31cb..7ab0c4af 100644
--- a/lib/PublicInbox/ExtSearchIdx.pm
+++ b/lib/PublicInbox/ExtSearchIdx.pm
@@ -396,18 +396,28 @@ sub idx_init { # similar to V2Writable
         my $info_dir = "$ALL/objects/info";
         my $alt = "$info_dir/alternates";
         my $mode = 0644;
-        my (%old, @old, %new, @new);
+        my (@old, @new, %seen); # seen: st_dev + st_ino
         if (-e $alt) {
                 open(my $fh, '<', $alt) or die "open $alt: $!";
                 $mode = (stat($fh))[2] & 07777;
-                while (<$fh>) {
-                        push @old, $_ if !$old{$_}++;
+                while (my $line = <$fh>) {
+                        chomp(my $d = $line);
+                        if (my @st = stat($d)) {
+                                next if $seen{"$st[0]\0$st[1]"}++;
+                        } else {
+                                warn "W: stat($d) failed (from $alt): $!\n";
+                        }
+                        push @old, $line;
                 }
         }
         for my $ibx (@{$self->{ibx_list}}) {
                 my $line = $ibx->git->{git_dir} . "/objects\n";
-                next if $old{$line};
-                $new{$line} = 1;
+                chomp(my $d = $line);
+                if (my @st = stat($d)) {
+                        next if $seen{"$st[0]\0$st[1]"}++;
+                } else {
+                        warn "W: stat($d) failed (from $ibx->{inboxdir}): $!\n";
+                }
                 push @new, $line;
         }
         if (scalar @new) {