]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/V2Writable.pm
imap+nntp: share COMPRESS implementation
[public-inbox.git] / lib / PublicInbox / V2Writable.pm
index efcc1fc21a18e0a23ba26cf12311d7355220bd7f..ed5182ae846029a5af0837060335c7d7d8a45066 100644 (file)
@@ -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)) {