]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LEI.pm
lei forget-search: support multiple args
[public-inbox.git] / lib / PublicInbox / LEI.pm
index 635cd0c5508aa3050640b3c2b001b5e8faf992e9..7dfd33989186d479c9f1b796599e29ff52d49fc1 100644 (file)
@@ -148,7 +148,7 @@ sub index_opt {
 
 my @c_opt = qw(c=s@ C=s@ quiet|q);
 my @net_opt = (qw(no-torsocks torsocks=s), PublicInbox::LeiQuery::curl_opt());
-my @lxs_opt = qw(remote! local! external! include|I=s@ exclude=s@ only=s@
+my @lxs_opt = qw(remote! local! external! include|I=s@ exclude=s@ only|O=s@
        import-remote!);
 
 # we don't support -C as an alias for --find-copies since it's already
@@ -225,7 +225,7 @@ our %CMD = ( # sorted in order of importance/use:
 
 'ls-search' => [ '[PREFIX]', 'list saved search queries',
                qw(format|f=s pretty l ascii z|0), @c_opt ],
-'forget-search' => [ 'OUTPUT', 'forget a saved search',
+'forget-search' => [ 'OUTPUT...', 'forget a saved search',
                qw(verbose|v+), @c_opt ],
 'edit-search' => [ 'OUTPUT', "edit saved search via `git config --edit'",
                        @c_opt ],
@@ -284,7 +284,7 @@ our %CMD = ( # sorted in order of importance/use:
        }, qw(config-file|system|global|file|f=s), # for conflict detection
         qw(edit|e c=s@ C=s@), pass_through('git config') ],
 'inspect' => [ 'ITEMS...|--stdin', 'inspect lei/store and/or local external',
-       qw(stdin| pretty ascii dir=s), @c_opt ],
+       qw(stdin| pretty ascii dir|d=s), @c_opt ],
 
 'init' => [ '[DIRNAME]', sub {
        "initialize storage, default: ".store_path($_[0]);
@@ -337,7 +337,8 @@ my %OPTDESC = (
 'path-a|a=s' => 'pre-image pathname associated with OID',
 'path-b|b=s' => 'post-image pathname associated with OID',
 'git-dir=s@' => 'additional git repository to scan',
-'dir=s inspect' => 'specify a inboxdir, extindex topdir or Xapian shard',
+'dir|d=s       inspect' =>
+       'specify a inboxdir, extindex topdir or Xapian shard',
 'proxy=s' => [ 'PROTO://HOST[:PORT]', # shared with curl(1)
        "proxy for (e.g. `socks5h://0:9050')" ],
 'torsocks=s' => ['VAL|auto|no|yes',
@@ -395,7 +396,7 @@ my %OPTDESC = (
                'exclude specified external(s) from search' ],
 'include|I=s@  q' => [ 'LOCATION',
                'include specified external(s) in search' ],
-'only=s@       q' => [ 'LOCATION',
+'only|O=s@     q' => [ 'LOCATION',
                'only use specified external(s) for search' ],
 'jobs=s        q' => [ '[SEARCH_JOBS][,WRITER_JOBS]',
                'control number of search and writer jobs' ],
@@ -454,16 +455,12 @@ my %CONFIG_KEYS = (
        'leistore.dir' => 'top-level storage location',
 );
 
-my @WQ_KEYS = qw(lxs l2m ikw pmd wq1 lne); # internal workers
+my @WQ_KEYS = qw(lxs l2m ikw pmd wq1 lne v2w); # internal workers
 
 sub _drop_wq {
        my ($self) = @_;
        for my $wq (grep(defined, delete(@$self{@WQ_KEYS}))) {
-               if ($wq->wq_kill) {
-                       $wq->wq_close(0, undef, $self);
-               } elsif ($wq->wq_kill_old) {
-                       $wq->wq_wait_old(undef, $self);
-               }
+               $wq->wq_kill('-TERM');
                $wq->DESTROY;
        }
 }
@@ -515,12 +512,6 @@ sub sigpipe_handler { # handles SIGPIPE from @WQ_KEYS workers
        fail_handler($_[0], 13, delete $_[0]->{1});
 }
 
-# PublicInbox::OnDestroy callback for SIGINT to take out the entire pgid
-sub sigint_reap {
-       my ($pgid) = @_;
-       dwaitpid($pgid) if kill('-INT', $pgid);
-}
-
 sub fail ($$;$) {
        my ($self, $buf, $exit_code) = @_;
        local $current_lei = $self;
@@ -575,8 +566,10 @@ sub _lei_atfork_child {
        } else { # worker, Net::NNTP (Net::Cmd) uses STDERR directly
                open STDERR, '+>&='.fileno($self->{2}) or warn "open $!";
                STDERR->autoflush(1);
+               POSIX::setpgid(0, $$) // die "setpgid(0, $$): $!";
        }
        close($_) for (grep(defined, delete @$self{qw(3 old_1 au_done)}));
+       delete $self->{-socks};
        if (my $op_c = delete $self->{pkt_op_c}) {
                close(delete $op_c->{sock});
        }
@@ -598,6 +591,7 @@ sub _lei_atfork_child {
                        $cb->(@_) unless PublicInbox::Eml::warn_ignore(@_)
                };
        }
+       $SIG{TERM} = sub { exit(128 + 15) };
        $current_lei = $persist ? undef : $self; # for SIG{__WARN__}
 }
 
@@ -646,6 +640,7 @@ sub workers_start {
        my $op_c = delete $lei->{pkt_op_c};
        @$end = ();
        $lei->event_step_init;
+       $wq->wq_wait_async($wq->can('_wq_done_wait') // \&wq_done_wait, $lei);
        ($op_c, $ops);
 }
 
@@ -653,7 +648,7 @@ sub workers_start {
 sub wait_wq_events {
        my ($lei, $op_c, $ops) = @_;
        for my $wq (grep(defined, @$lei{qw(ikw pmd)})) { # auxiliary WQs
-               $wq->wq_close(1);
+               $wq->wq_close;
        }
        $op_c->{ops} = $ops;
 }
@@ -1147,13 +1142,18 @@ sub event_step {
                if ($buf eq '') {
                        _drop_wq($self); # EOF, client disconnected
                        dclose($self);
-               } elsif ($buf =~ /\A(STOP|CONT)\z/) {
+                       $buf = 'TERM';
+               }
+               if ($buf =~ /\A(?:STOP|CONT|TERM)\z/) {
+                       my $sig = "-$buf";
                        for my $wq (grep(defined, @$self{@WQ_KEYS})) {
-                               $wq->wq_kill($buf) or $wq->wq_kill_old($buf);
+                               $wq->wq_kill($sig);
                        }
                } else {
                        die "unrecognized client signal: $buf";
                }
+               my $s = $self->{-socks} // []; # lei up --all
+               @$s = grep { send($_, $buf, MSG_EOR) } @$s;
        };
        if (my $err = $@) {
                eval { $self->fail($err) };
@@ -1390,8 +1390,7 @@ sub fchdir {
 sub wq_eof { # EOF callback for main daemon
        my ($lei) = @_;
        local $current_lei = $lei;
-       my $wq1 = delete $lei->{wq1} // return $lei->fail; # already failed
-       $wq1->wq_wait_old($wq1->can('_wq_done_wait') // \&wq_done_wait, $lei);
+       delete $lei->{wq1} // return $lei->fail; # already failed
 }
 
 sub watch_state_ok ($) {