From 8e1ec8836dabc58dfc0115b36ed440b4371b70d7 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 28 Mar 2020 00:56:03 +0000 Subject: searchidxshard: ensure we set indexlevel on shard[0] For sharded v2 repositories with few-enough messages, it is possible for shard[0] to go unused and never trigger the ->commit_txn_lazy to set the indexlevel field in Xapian metadata. So set it immediately at initialization and avoid this case. While we're at it, avoid triggering needless pwrite syscalls from ->set_metadata by checking with ->get_metadata, first. --- lib/PublicInbox/SearchIdx.pm | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'lib/PublicInbox/SearchIdx.pm') diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index 44b05813..7d089e7a 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -58,6 +58,7 @@ sub new { ibx_ver => $version, indexlevel => $indexlevel, }, $class; + $self->{-set_indexlevel_once} = 1 if $indexlevel eq 'medium'; $ibx->umask_prepare; if ($version == 1) { $self->{lock_path} = "$inboxdir/ssoma.lock"; @@ -842,20 +843,27 @@ sub begin_txn_lazy { }); } +# store 'indexlevel=medium' in v2 shard=0 and v1 (only one shard) +# This metadata is read by Admin::detect_indexlevel: +sub set_indexlevel { + my ($self) = @_; + + if (!$self->{shard} && # undef or 0, not >0 + delete($self->{-set_indexlevel_once})) { + my $xdb = $self->{xdb}; + my $level = $xdb->get_metadata('indexlevel'); + if (!$level || $level ne 'medium') { + $xdb->set_metadata('indexlevel', 'medium'); + } + } +} + sub commit_txn_lazy { my ($self) = @_; delete $self->{txn} or return; $self->{-inbox}->with_umask(sub { if (my $xdb = $self->{xdb}) { - - # store 'indexlevel=medium' in v2 shard=0 and - # v1 (only one shard) - # This metadata is read by Admin::detect_indexlevel: - if (!$self->{shard} # undef or 0, not >0 - && $self->{indexlevel} eq 'medium') { - $xdb->set_metadata('indexlevel', 'medium'); - } - + set_indexlevel($self); $xdb->commit_transaction; } $self->{over}->commit_lazy if $self->{over}; -- cgit v1.2.3-24-ge0c7