X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FSearchIdxShard.pm;h=45240e0793a8867e272005d386712e81004af803;hb=af0b0fb7a454470a32c452119d0392e0dedb3fe1;hp=b6eef6bdd4b80bc6600af0d100ba5b0260a66d55;hpb=7281c5c492f9d6bbd585da9f061d19819d952352;p=public-inbox.git diff --git a/lib/PublicInbox/SearchIdxShard.pm b/lib/PublicInbox/SearchIdxShard.pm index b6eef6bd..45240e07 100644 --- a/lib/PublicInbox/SearchIdxShard.pm +++ b/lib/PublicInbox/SearchIdxShard.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2020 all contributors +# Copyright (C) 2018-2021 all contributors # License: AGPL-3.0+ # Internal interface for a single Xapian shard in V2 inboxes. @@ -34,6 +34,7 @@ sub spawn_worker { my $pid = fork; defined $pid or die "fork failed: $!\n"; if ($pid == 0) { + eval { PublicInbox::DS->Reset }; # these signals are localized in parent $SIG{$_} = 'IGNORE' for (qw(TERM INT QUIT)); PublicInbox::Sigfd::sig_setmask($oldset); @@ -69,35 +70,37 @@ sub shard_worker_loop ($$$$$) { $0 = "shard[$shard]"; $self->begin_txn_lazy; while (my $line = readline($r)) { + chomp $line; $v2w->{current_info} = "[$shard] $line"; - if ($line eq "commit\n") { + if ($line eq 'commit') { $self->commit_txn_lazy; - } elsif ($line eq "close\n") { + } elsif ($line eq 'close') { $self->idx_release; - } elsif ($line eq "barrier\n") { + } elsif ($line eq 'barrier') { $self->commit_txn_lazy; # no need to lock < 512 bytes is atomic under POSIX print $bnote "barrier $shard\n" or die "write failed for barrier $!\n"; - } elsif ($line =~ /\AD ([0-9]+)\n\z/s) { + } elsif ($line =~ /\AD ([0-9]+)\z/s) { $self->remove_by_docid($1 + 0); } elsif ($line =~ s/\A\+X //) { my ($len, $docid, $eidx_key) = split(/ /, $line, 3); - chomp $eidx_key; $self->add_eidx_info($docid, $eidx_key, eml($r, $len)); } elsif ($line =~ s/\A-X //) { my ($len, $docid, $eidx_key) = split(/ /, $line, 3); - chomp $eidx_key; $self->remove_eidx_info($docid, $eidx_key, eml($r, $len)); - } elsif ($line =~ s/\AO ([^\n]+)\n//) { + } elsif ($line =~ s/\A=K (\d+) //) { + $self->set_keywords($1 + 0, split(/ /, $line)); + } elsif ($line =~ s/\A-K (\d+) //) { + $self->remove_keywords($1 + 0, split(/ /, $line)); + } elsif ($line =~ s/\A\+K (\d+) //) { + $self->add_keywords($1 + 0, split(/ /, $line)); + } elsif ($line =~ s/\AO ([^\n]+)//) { my $over_fn = $1; $over_fn =~ tr/\0/\n/; $self->over_check(PublicInbox::Over->new($over_fn)); - } elsif ($line =~ /\AE ([0-9]+)\n/) { - $self->reindex_docid($1 + 0); } else { - chomp $line; my $eidx_key; if ($line =~ s/\AX=(.+)\0//) { $eidx_key = $1; @@ -124,9 +127,9 @@ sub shard_worker_loop ($$$$$) { } sub index_raw { - my ($self, $msgref, $eml, $smsg, $ibx) = @_; + my ($self, $msgref, $eml, $smsg, $eidx_key) = @_; if (my $w = $self->{w}) { - my @ekey = $ibx ? ('X='.$ibx->eidx_key."\0") : (); + my @ekey = defined($eidx_key) ? ("X=$eidx_key\0") : (); $msgref //= \($eml->as_string); $smsg->{raw_bytes} //= length($$msgref); # mid must be last, it can contain spaces (but not LF) @@ -140,7 +143,7 @@ sub index_raw { $eml = PublicInbox::Eml->new($msgref); } $self->begin_txn_lazy; - $smsg->{eidx_key} = $ibx->eidx_key if $ibx; + $smsg->{eidx_key} = $eidx_key if defined $eidx_key; $self->add_message($eml, $smsg); } } @@ -214,6 +217,33 @@ sub shard_remove { } } +sub shard_set_keywords { + my ($self, $docid, @kw) = @_; + if (my $w = $self->{w}) { # triggers remove_by_docid in a shard child + print $w "=K $docid @kw\n" or die "failed to write: $!"; + } else { # same process + $self->set_keywords($docid, @kw); + } +} + +sub shard_remove_keywords { + my ($self, $docid, @kw) = @_; + if (my $w = $self->{w}) { # triggers remove_by_docid in a shard child + print $w "-K $docid @kw\n" or die "failed to write: $!"; + } else { # same process + $self->remove_keywords($docid, @kw); + } +} + +sub shard_add_keywords { + my ($self, $docid, @kw) = @_; + if (my $w = $self->{w}) { # triggers remove_by_docid in a shard child + print $w "+K $docid @kw\n" or die "failed to write: $!"; + } else { # same process + $self->add_keywords($docid, @kw); + } +} + sub shard_over_check { my ($self, $over) = @_; if (my $w = $self->{w}) { # triggers remove_by_docid in a shard child @@ -225,13 +255,4 @@ sub shard_over_check { } } -sub shard_reindex_docid { - my ($self, $docid) = @_; - if (my $w = $self->{w}) { - print $w "E $docid\n" or die "failed to write to shard: $!"; - } else { - $self->reindex_docid($docid); - } -} - 1;