]> Sergey Matveev's repositories - public-inbox.git/commitdiff
v1: allow upgrading indexlevel=basic to 'medium' or 'full'
authorEric Wong <e@80x24.org>
Fri, 20 Jul 2018 06:58:45 +0000 (06:58 +0000)
committerEric Wong <e@80x24.org>
Fri, 20 Jul 2018 07:02:08 +0000 (07:02 +0000)
For v1 repos, we don't need to write any metadata to Xapian
and changing from 'basic' to 'medium' or 'full' will work.

For v2, the metadata for indexing is stored in msgmap (because
the Xapian databases are partitioned for parallelism), so a
reindex is required.

lib/PublicInbox/SearchIdx.pm
t/v1reindex.t

index bb60506ce1a9996e1d6a9971e61459cf13b250b7..1d259a8642a38a81677b30253e469592cf5ab5e8 100644 (file)
@@ -27,6 +27,8 @@ use constant {
        DEBUG => !!$ENV{DEBUG},
 };
 
+my $xapianlevels = qr/\A(?:full|medium)\z/;
+
 my %GIT_ESC = (
        a => "\a",
        b => "\b",
@@ -365,7 +367,6 @@ sub add_xapian ($$$$$) {
 sub add_message {
        # mime = Email::MIME object
        my ($self, $mime, $bytes, $num, $oid, $mid0) = @_;
-       my $xapianlevels = qr/\A(?:full|medium)\z/;
        my $mids = mids($mime->header_obj);
        $mid0 = $mids->[0] unless defined $mid0; # v1 compatibility
        unless (defined $num) { # v1
@@ -714,7 +715,7 @@ sub _index_sync {
                        }
                        $dbh->commit;
                }
-               if ($mkey && $newest) {
+               if ($mkey && $newest && $self->{indexlevel} =~ $xapianlevels) {
                        my $cur = $xdb->get_metadata($mkey);
                        if (need_update($self, $cur, $newest)) {
                                $xdb->set_metadata($mkey, $newest);
index d97938d3174ee18cd4b140eba8104de17cf3ffda..75380f0f5f229214a3579d81a011c78b0a3c76dc 100644 (file)
@@ -124,9 +124,10 @@ $rw = PublicInbox::SearchIdx->new($ibx, 1);
        ok(-d $xap, 'Xapian directories recreated');
        delete $ibx->{mm};
        is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
+       my $mset = $ibx->search->query('hello world', {mset=>1});
+       isnt(0, $mset->size, 'got Xapian search results');
 }
 
-
 ok(unlink "$mainrepo/public-inbox/msgmap.sqlite3", 'remove msgmap');
 remove_tree($xap);
 ok(!-d $xap, 'Xapian directories removed again');
@@ -144,7 +145,25 @@ $rw = PublicInbox::SearchIdx->new($ibx, 1);
        ok(-d $xap, 'Xapian directories recreated');
        delete $ibx->{mm};
        is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
+       my $mset = $ibx->search->reopen->query('hello world', {mset=>1});
+       is(0, $mset->size, "no Xapian search results");
 }
 
+# upgrade existing basic to medium
+# note: changing indexlevels is not yet supported in v2,
+# and may not be without more effort
+$ibx_config->{indexlevel} = 'medium';
+$ibx = PublicInbox::Inbox->new($ibx_config);
+$rw = PublicInbox::SearchIdx->new($ibx, 1);
+# no removals
+{
+       my @warn;
+       local $SIG{__WARN__} = sub { push @warn, @_ };
+       eval { $rw->index_sync };
+       is($@, '', 'no error from indexing');
+       is_deeply(\@warn, [], 'no warnings');
+       my $mset = $ibx->search->reopen->query('hello world', {mset=>1});
+       isnt(0, $mset->size, 'search OK after basic -> medium');
+}
 
 done_testing();