about summary refs log tree commit homepage
path: root/lib/PublicInbox/LeiToMail.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-09-10 01:18:59 +0000
committerEric Wong <e@80x24.org>2022-09-10 01:35:02 +0000
commitc03e3836f127f549b8568b05ada7ab81684539fc (patch)
treefb49cfb9cd2cb9a470f55fb584ba7694d15b0153 /lib/PublicInbox/LeiToMail.pm
parent0ce21001f0fd7f2369611f350f4722bb9597eca3 (diff)
downloadpublic-inbox-c03e3836f127f549b8568b05ada7ab81684539fc.tar.gz
Excessive IMAP connections can overload IMAP servers and cause
clients to be disconnected without diagnostic messages.
Use $lei->fail on these exceptions to propagate errors to the
CLI ASAP to avoid further errors down the line.

This ought to make problems more apparent for users using IMAP
destinations.

Reported-by: Ricardo Ribalda <ribalda@chromium.org>
Link: https://public-inbox.org/meta/CANiDSCsDfutAUMBLPZbxdyka+_jnhv+4YNYdL9QPRoC=wNUGCQ@mail.gmail.com/
Diffstat (limited to 'lib/PublicInbox/LeiToMail.pm')
-rw-r--r--lib/PublicInbox/LeiToMail.pm10
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/PublicInbox/LeiToMail.pm b/lib/PublicInbox/LeiToMail.pm
index 2aa3977e..03cbde3b 100644
--- a/lib/PublicInbox/LeiToMail.pm
+++ b/lib/PublicInbox/LeiToMail.pm
@@ -310,8 +310,11 @@ sub _imap_write_cb ($$) {
         my $dedupe = $lei->{dedupe};
         $dedupe->prepare_dedupe if $dedupe;
         my $append = $lei->{net}->can('imap_append');
-        my $uri = $self->{uri};
-        my $mic = $lei->{net}->mic_get($uri);
+        my $uri = $self->{uri} // die 'BUG: no {uri}';
+        my $mic = $lei->{net}->mic_get($uri) // die <<EOM;
+E: $uri connection failed.
+E: Consider using `--jobs ,1' to limit IMAP connections
+EOM
         my $folder = $uri->mailbox;
         $uri->uidvalidity($mic->uidvalidity($folder));
         my $lse = $lei->{lse}; # may be undef
@@ -749,7 +752,8 @@ sub do_post_auth {
                 $au_peers->[1] = undef;
                 sysread($au_peers->[0], my $barrier1, 1);
         }
-        $self->{wcb} = $self->write_cb($lei);
+        eval { $self->{wcb} = $self->write_cb($lei) };
+        $lei->fail($@) if $@;
         if ($au_peers) { # wait for peer l2m to set write_cb
                 $au_peers->[3] = undef;
                 sysread($au_peers->[2], my $barrier2, 1);