X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FV2Writable.pm;h=ed5182ae846029a5af0837060335c7d7d8a45066;hb=23af251dd607c4e75ab1e68063f2c885c48cc035;hp=efcc1fc21a18e0a23ba26cf12311d7355220bd7f;hpb=9f02576da775abf208f5a03c03b6f7abd72596d0;p=public-inbox.git diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index efcc1fc2..ed5182ae 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -547,11 +547,11 @@ sub checkpoint ($;$) { } my $shards = $self->{idx_shards}; if ($shards) { - my $mm = $self->{mm}; - my $dbh = $mm->{dbh} if $mm; + my $dbh = $self->{mm}->{dbh} if $self->{mm}; # SQLite msgmap data is second in importance $dbh->commit if $dbh; + eval { $dbh->do('PRAGMA optimize') }; # SQLite overview is third $self->{oidx}->commit_lazy; @@ -620,16 +620,10 @@ sub done { my $m = $err ? 'rollback' : 'commit'; eval { $mm->{dbh}->$m }; $err .= "msgmap $m: $@\n" if $@; - eval { $mm->{dbh}->do('PRAGMA optimize') }; - $err .= "msgmap optimize: $@\n" if $@; } - if ($self->{oidx} && $self->{oidx}->{dbh}) { - if ($err) { - eval { $self->{oidx}->rollback_lazy }; - $err .= "overview rollback: $@\n" if $@; - } - eval { $self->{oidx}->{dbh}->do('PRAGMA optimize') }; - $err .= "overview optimize: $@\n" if $@; + if ($self->{oidx} && $self->{oidx}->{dbh} && $err) { + eval { $self->{oidx}->rollback_lazy }; + $err .= "overview rollback: $@\n" if $@; } my $shards = delete $self->{idx_shards}; @@ -819,8 +813,8 @@ sub index_oid { # cat_async callback } } } + my $oidx = $self->{oidx}; if (!defined($num)) { # reuse if reindexing (or duplicates) - my $oidx = $self->{oidx}; for my $mid (@$mids) { ($num, $mid0) = $oidx->num_mid0_for_oid($oid, $mid); last if defined $num; @@ -828,6 +822,11 @@ sub index_oid { # cat_async callback } $mid0 //= do { # is this a number we got before? $num = $arg->{mm_tmp}->num_for($mids->[0]); + + # don't clobber existing if Message-ID is reused: + if (my $x = defined($num) ? $oidx->get_art($num) : undef) { + undef($num) if $x->{blob} ne $oid; + } defined($num) ? $mids->[0] : undef; }; if (!defined($num)) {