]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
xap_helper: enable FLAG_PURE_NOT in external process
authorEric Wong <e@80x24.org>
Sun, 23 Feb 2025 13:13:33 +0000 (13:13 +0000)
committerEric Wong <e@80x24.org>
Wed, 26 Feb 2025 02:19:52 +0000 (02:19 +0000)
Since public-facing WWW uses an external process with
a non-blocking socket, clients will only see 503 errors
if the search is overloaded.  While allowing pure NOT
queries is expensive, there are already many possible
ways of triggering expensive queries so it's probably not
a problem to allow one more.

lib/PublicInbox/XapHelper.pm
lib/PublicInbox/xap_helper.h

index 7e61631c056e99cd706867f9855b11b11460e62f..15abed796c4822f8037daa1b41e4a07083826a24 100644 (file)
@@ -20,6 +20,7 @@ use Carp qw(croak);
 my $X = \%PublicInbox::Search::X;
 our (%SRCH, %WORKERS, $nworker, $workerset, $in, $SHARD_NFD, $MY_FD_MAX);
 our $stderr = \*STDERR;
+my $QP_FLAGS = $PublicInbox::Search::QP_FLAGS;
 
 sub cmd_test_inspect {
        my ($req) = @_;
@@ -194,7 +195,7 @@ sub dispatch {
        $key .= "\0".join("\0", map { ('-Q', $_) } @{$req->{Q}}) if $req->{Q};
        my $new;
        $req->{srch} = $SRCH{$key} // do {
-               $new = { qp_flags => $PublicInbox::Search::QP_FLAGS };
+               $new = { qp_flags => $QP_FLAGS };
                my $nfd = scalar(@$dirs) * PublicInbox::Search::SHARD_COST;
                $SHARD_NFD += $nfd;
                if ($SHARD_NFD > $MY_FD_MAX) {
@@ -337,6 +338,7 @@ sub start (@) {
                die "E: unable to get RLIMIT_NOFILE: $!";
        warn "W: RLIMIT_NOFILE=$MY_FD_MAX too low\n" if $MY_FD_MAX < 72;
        $MY_FD_MAX -= 64;
+       $QP_FLAGS |= PublicInbox::Search::FLAG_PURE_NOT();
 
        local $nworker = $opt->{j};
        return recv_loop() if $nworker == 0;
index 7e48de8ae46adb4b7a650a11d801de54d0e6f5d4..9c8436dc7e089222aa32a7b95a57361b86dd0779 100644 (file)
@@ -590,6 +590,7 @@ static void srch_init(struct req *req)
        const unsigned FLAG_PHRASE = Xapian::QueryParser::FLAG_PHRASE;
        srch->qp_flags = Xapian::QueryParser::FLAG_BOOLEAN |
                        Xapian::QueryParser::FLAG_LOVEHATE |
+                       Xapian::QueryParser::FLAG_PURE_NOT |
                        Xapian::QueryParser::FLAG_WILDCARD;
        long nfd = req->dirc * SHARD_COST;