diff options
author | Eric Wong <e@yhbt.net> | 2020-07-04 21:33:13 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-07-05 21:45:19 +0000 |
commit | d75cbb9b69a780b6bbc37e243ada35dfd0c47552 (patch) | |
tree | 12fb44285885b52a32772e22a75f2e04fd51541d /lib/PublicInbox/WatchMaildir.pm | |
parent | 2d0438df824317049e29837c6d187b54ea89b515 (diff) | |
download | public-inbox-d75cbb9b69a780b6bbc37e243ada35dfd0c47552.tar.gz |
Network connections fail and need to be detected sooner rather than later during IDLE to avoid backtrace floods. In case the IDLE process dies completely, don't respawn right away, either, to avoid entering a respawn loop. There's also a typo fix :P
Diffstat (limited to 'lib/PublicInbox/WatchMaildir.pm')
-rw-r--r-- | lib/PublicInbox/WatchMaildir.pm | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm index 23b2e9f1..7547f6e4 100644 --- a/lib/PublicInbox/WatchMaildir.pm +++ b/lib/PublicInbox/WatchMaildir.pm @@ -497,7 +497,8 @@ sub imap_idle_once ($$$$) { } $self->{idle_mic} = $mic; # for ->quit my @res; - until ($self->{quit} || grep(/^\* [0-9]+ EXISTS/, @res) || $i <= 0) { + until ($self->{quit} || !$mic->IsConnected || + grep(/^\* [0-9]+ EXISTS/, @res) || $i <= 0) { @res = $mic->idle_data($i); $i = $end - now(); } @@ -520,8 +521,13 @@ sub watch_imap_idle_1 ($$$) { local $0 = $uri->mailbox." $sec"; until ($self->{quit}) { $mic //= PublicInbox::IMAPClient->new(%$mic_arg); - my $err = imap_fetch_all($self, $mic, $url); - $err //= imap_idle_once($self, $mic, $intvl, $url); + my $err; + if ($mic && $mic->IsConnected) { + $err = imap_fetch_all($self, $mic, $url); + $err //= imap_idle_once($self, $mic, $intvl, $url); + } else { + $err = "not connected: $!"; + } if ($err && !$self->{quit}) { warn $err, "\n"; $mic = undef; @@ -545,6 +551,13 @@ sub watch_atfork_parent ($) { _done_for_now($self); } +sub imap_idle_requeue ($) { # DS::add_timer callback + my ($self, $url_intvl) = @{$_[0]}; + return if $self->{quit}; + push @{$self->{idle_todo}}, $url_intvl; + event_step($self); +} + sub imap_idle_reap { # PublicInbox::DS::dwaitpid callback my ($self, $pid) = @_; my $url_intvl = delete $self->{idle_pids}->{$pid} or @@ -553,8 +566,8 @@ sub imap_idle_reap { # PublicInbox::DS::dwaitpid callback my ($url, $intvl) = @$url_intvl; return if $self->{quit}; warn "W: PID=$pid on $url died: \$?=$?\n" if $?; - push @{$self->{idle_todo}}, $url_intvl; - PubicInbox::DS::requeue($self); # call ->event_step to respawn + PublicInbox::DS::add_timer(60, + \&imap_idle_requeue, [ $self, $url_intvl ]); } sub imap_idle_fork ($$) { |