diff options
author | Eric Wong <e@80x24.org> | 2019-05-29 20:56:32 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-05-29 20:56:59 +0000 |
commit | 3c9ab47c7d0e26fd22e1f42a198696b093629802 (patch) | |
tree | aa6df6d879d82ced06add1d4869c81336d2664e5 /lib | |
parent | 4f814ff418e334a9b7b9bd96cd5450c2823de2f6 (diff) | |
download | public-inbox-3c9ab47c7d0e26fd22e1f42a198696b093629802.tar.gz |
And use it from Admin. It's easy to tell what indexlevel=basic is from unconfigured inboxes, but distinguishing between 'medium' and 'full' would require stat()-ing position.* files which is fragile and Xapian-implementation-dependent. So use the metadata facility of Xapian and store it in the main partition so Admin tools can deal better with unconfigured inboxes copied using generic tools like cp(1) or rsync(1).
Diffstat (limited to 'lib')
-rw-r--r-- | lib/PublicInbox/Admin.pm | 25 | ||||
-rw-r--r-- | lib/PublicInbox/SearchIdx.pm | 8 | ||||
-rw-r--r-- | lib/PublicInbox/Xapcmd.pm | 8 |
3 files changed, 41 insertions, 0 deletions
diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm index 07d8b572..4a862c6d 100644 --- a/lib/PublicInbox/Admin.pm +++ b/lib/PublicInbox/Admin.pm @@ -41,6 +41,31 @@ sub resolve_repo_dir { } } +# for unconfigured inboxes +sub detect_indexlevel ($) { + my ($ibx) = @_; + + # brand new or never before indexed inboxes default to full + return 'full' unless $ibx->over; + delete $ibx->{over}; # don't leave open FD lying around + + my $l = 'basic'; + my $srch = $ibx->search or return $l; + delete $ibx->{search}; # don't leave open FD lying around + if (my $xdb = $srch->xdb) { + $l = 'full'; + my $m = $xdb->get_metadata('indexlevel'); + if ($m eq 'medium') { + $l = $m; + } elsif ($m ne '') { + warn <<""; +$ibx->{mainrepo} has unexpected indexlevel in Xapian: $m + + } + } + $l; +} + sub resolve_inboxes { my ($argv, $warn_on_unconfigured) = @_; require PublicInbox::Config; diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index b963805e..99856286 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -828,6 +828,14 @@ sub commit_txn_lazy { delete $self->{txn} or return; $self->{-inbox}->with_umask(sub { if (my $xdb = $self->{xdb}) { + + # store 'indexlevel=medium' in v2 part=0 and v1 (only part) + # This metadata is read by Admin::detect_indexlevel: + if (!$self->{partition} # undef or 0, not >0 + && $self->{indexlevel} eq 'medium') { + $xdb->set_metadata('indexlevel', 'medium'); + } + $xdb->commit_transaction; } $self->{over}->commit_lazy if $self->{over}; diff --git a/lib/PublicInbox/Xapcmd.pm b/lib/PublicInbox/Xapcmd.pm index 7e3d47fb..90672310 100644 --- a/lib/PublicInbox/Xapcmd.pm +++ b/lib/PublicInbox/Xapcmd.pm @@ -275,6 +275,14 @@ sub cpdb ($$) { my $lc = $src->get_metadata('last_commit'); $dst->set_metadata('last_commit', $lc) if $lc; + # only the first xapian partition (0) gets 'indexlevel' + if ($old =~ m!(?:xapian\d+|xap\d+/0)\z!) { + my $l = $src->get_metadata('indexlevel'); + if ($l eq 'medium') { + $dst->set_metadata('indexlevel', $l); + } + } + $it = $src->postlist_begin(''); $end = $src->postlist_end(''); if ($pr) { |