use PublicInbox::OverIdx;
use PublicInbox::Msgmap;
use PublicInbox::Spawn qw(spawn popen_rd run_die);
+use PublicInbox::Search;
use PublicInbox::SearchIdx qw(log2stack is_ancestor check_size is_bad_blob);
use IO::Handle; # ->autoflush
use File::Temp ();
}
my $midx = $self->{midx}; # misc index
- $midx->commit_txn if $midx;
+ if ($midx) {
+ $midx->commit_txn;
+ $PublicInbox::Search::X{CLOEXEC_UNSET} and
+ $self->git->cleanup;
+ }
# last_commit is special, don't commit these until
# Xapian shards are done:
$dbh->commit;
$dbh->begin_work;
}
- $midx->begin_txn if $midx;
+ if ($midx) {
+ $self->git->batch_prepare;
+ $midx->begin_txn;
+ }
}
$self->{total_bytes} += $self->{transact_bytes};
$self->{transact_bytes} = 0;
}
# {unindexed} is unlikely
- if ((my $unindexed = $arg->{unindexed}) && scalar(@$mids) == 1) {
- $num = delete($unindexed->{$mids->[0]});
+ if (my $unindexed = $arg->{unindexed}) {
+ my $oidbin = pack('H*', $oid);
+ my $u = $unindexed->{$oidbin};
+ ($num, $mid0) = splice(@$u, 0, 2) if $u;
if (defined $num) {
- $mid0 = $mids->[0];
$self->{mm}->mid_set($num, $mid0);
- delete($arg->{unindexed}) if !keys(%$unindexed);
+ if (scalar(@$u) == 0) { # done with current OID
+ delete $unindexed->{$oidbin};
+ delete($arg->{unindexed}) if !keys(%$unindexed);
+ }
}
}
if (!defined($num)) { # reuse if reindexing (or duplicates)
warn "BUG: multiple articles linked to $oid\n",
join(',',sort keys %gone), "\n";
}
- foreach my $num (keys %gone) {
+ # reuse (num => mid) mapping in ascending numeric order
+ for my $num (sort { $a <=> $b } keys %gone) {
+ $num += 0;
if ($unindexed) {
my $mid0 = $mm->mid_for($num);
- $unindexed->{$mid0} = $num;
+ my $oidbin = pack('H*', $oid);
+ push @{$unindexed->{$oidbin}}, $num, $mid0;
}
$mm->num_delete($num);
}
sub unindex_todo ($$$) {
my ($self, $sync, $unit) = @_;
my $unindex_range = delete($unit->{unindex_range}) // return;
- my $unindexed = $sync->{unindexed} //= {}; # $mid0 => $num
+ my $unindexed = $sync->{unindexed} //= {}; # $oidbin => [$num, $mid0]
my $before = scalar keys %$unindexed;
# order does not matter, here:
my $fh = $unit->{git}->popen(qw(log --raw -r --no-notes --no-color