From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id CF3711F66F; Mon, 31 Aug 2020 04:41:40 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Cc: Eric Wong Subject: [PATCH 01/11] watch: limit batch size of NNTP and IMAP workers, too Date: Mon, 31 Aug 2020 04:41:30 +0000 Message-Id: <20200831044140.17027-2-e@80x24.org> In-Reply-To: <20200831044140.17027-1-e@80x24.org> References: <20200831044140.17027-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: From: Eric Wong We don't want to monopolize locks because processes can easily block each other if using `watchspam' on a Maildir while a big NNTP or IMAP import is happening. This can also happen if somebody configured a single inbox to watch from several sources to merge several mailboxes into one (e.g. both an IMAP and Maildir are watched). --- lib/PublicInbox/WatchMaildir.pm | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm index a227a6fd..5176ef69 100644 --- a/lib/PublicInbox/WatchMaildir.pm +++ b/lib/PublicInbox/WatchMaildir.pm @@ -108,6 +108,7 @@ sub new { return unless $mdre || scalar(keys %imap) || scalar(keys %nntp); bless { + max_batch => 10, # avoid hogging locks for too long spamcheck => $spamcheck, mdmap => \%mdmap, mdre => $mdre, @@ -472,8 +473,14 @@ sub imap_fetch_all ($$$) { $l_uid = $uids->[-1] + 1; # for next search my $last_uid; + my $n = $self->{max_batch}; while (scalar @$uids) { + if (--$n < 0) { + _done_for_now($self); + $itrk->update_last($r_uidval, $last_uid); + $n = $self->{max_batch}; + } my @batch = splice(@$uids, 0, $bs); $batch = join(',', @batch); local $0 = "UID:$batch $mbx $sec"; @@ -888,9 +895,15 @@ sub nntp_fetch_all ($$$) { }; my $inboxes = $self->{nntp}->{$url}; my $last_art; + my $n = $self->{max_batch}; for ($beg..$end) { last if $self->{quit}; $art = $_; + if (--$n < 0) { + _done_for_now($self); + $itrk->update_last(0, $last_art); + $n = $self->{max_batch}; + } my $raw = $nn->article($art); unless (defined($raw)) { my $msg = $nn->message; @@ -976,12 +989,11 @@ sub fs_scan_step { local $PublicInbox::DS::in_loop = 0; # waitpid() synchronously # continue existing scan - my $max = 10; my $opendirs = $self->{opendirs}; my @dirnames = keys %$opendirs; foreach my $dir (@dirnames) { my $dh = delete $opendirs->{$dir}; - my $n = $max; + my $n = $self->{max_batch}; while (my $fn = readdir($dh)) { _try_path($self, "$dir/$fn"); last if --$n < 0; @@ -996,7 +1008,7 @@ sub fs_scan_step { warn "failed to open $dir: $!\n"; next; } - my $n = $max; + my $n = $self->{max_batch}; while (my $fn = readdir($dh)) { _try_path($self, "$dir/$fn"); last if --$n < 0;