X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWatchMaildir.pm;h=5176ef69db9e9d698ceb4a33efadc019739b80f9;hb=bb8aaee10d771f7e1461efd8ec86269215787e52;hp=4ae400f7905fdb203fd3fa69507634e243b9c5c5;hpb=4f623a133e5531032e378a3d5dd9aec9243450ae;p=public-inbox.git diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm index 4ae400f7..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"; @@ -494,7 +501,7 @@ sub imap_fetch_all ($$$) { last if $self->{quit}; } _done_for_now($self); - $itrk->update_last($r_uidval, $last_uid) if defined $last_uid; + $itrk->update_last($r_uidval, $last_uid); } until ($err || $self->{quit}); $err; } @@ -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; @@ -918,8 +931,8 @@ sub nntp_fetch_all ($$$) { } $last_art = $art; } - $itrk->update_last(0, $last_art) if defined $last_art; _done_for_now($self); + $itrk->update_last(0, $last_art); $err; } @@ -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;