| # Copyright all contributors <meta@public-inbox.org> |
| # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> |
| |
| # "lei reindex" command to reindex everything in lei/store |
| package PublicInbox::LeiReindex; |
| use v5.12; |
| use parent qw(PublicInbox::IPC); |
| |
| sub reindex_full { |
| my ($lei) = @_; |
| my $sto = $lei->{sto}; |
| my $max = $sto->search->over(1)->max; |
| $lei->qerr("# reindexing 1..$max"); |
| $sto->wq_do('reindex_art', $_) for (1..$max); |
| } |
| |
| sub reindex_store { # via wq_do |
| my ($self) = @_; |
| my ($lei, $argv) = delete @$self{qw(lei argv)}; |
| if (!@$argv) { |
| reindex_full($lei); |
| } |
| } |
| |
| sub lei_reindex { |
| my ($lei, @argv) = @_; |
| my $sto = $lei->_lei_store or return $lei->fail('nothing indexed'); |
| $sto->write_prepare($lei); |
| my $self = bless { lei => $lei, argv => \@argv }, __PACKAGE__; |
| my ($op_c, $ops) = $lei->workers_start($self, 1); |
| $lei->{wq1} = $self; |
| $lei->wait_wq_events($op_c, $ops); |
| $self->wq_do('reindex_store'); |
| $self->wq_close; |
| } |
| |
| sub _lei_wq_eof { # EOF callback for main lei daemon |
| my ($lei) = @_; |
| $lei->{sto}->wq_do('reindex_done'); |
| $lei->wq_eof; |
| } |
| |
| sub ipc_atfork_child { |
| my ($self) = @_; |
| $self->{lei}->_lei_atfork_child; |
| $self->SUPER::ipc_atfork_child; |
| } |
| |
| 1; |