]> Sergey Matveev's repositories - public-inbox.git/commitdiff
imap: improve IDLE handling at graceful shutdown
authorEric Wong <e@yhbt.net>
Mon, 15 Jun 2020 07:43:17 +0000 (07:43 +0000)
committerEric Wong <e@yhbt.net>
Tue, 16 Jun 2020 00:07:05 +0000 (00:07 +0000)
Since IMAP IDLE users aren't expected to issue any commands, we
can terminate their connections immediately on graceful
shutdown.

Furthermore, we need to drop the inotify FD from the epoll set
to avoid warnings during global destruction.  Embarassingly,
this required fixing wacky test ordering from 2a717d13f10fcdc6
("nntpd+imapd: detect replaced over.sqlite3")

lib/PublicInbox/IMAP.pm
lib/PublicInbox/InboxIdle.pm
t/nntpd.t

index 9ae7c60e75ee161eb276b23d750fa65c4ea9a7ce..d4ef6efe156d2b3efde19d4eafa08aa3a760b73d 100644 (file)
@@ -1462,6 +1462,10 @@ sub cmd_starttls ($$) {
 # for graceful shutdown in PublicInbox::Daemon:
 sub busy {
        my ($self, $now) = @_;
+       if (defined($self->{-idle_tag})) {
+               $self->write(\"* BYE server shutting down\r\n");
+               return; # not busy anymore
+       }
        ($self->{rbuf} || $self->{wbuf} || $self->not_idle_long($now));
 }
 
index d60d4f239c381e2d8fd07d0247a016da78e30269..d0bb43c58486a5900348a74031cb44f95820bf74 100644 (file)
@@ -79,4 +79,8 @@ sub event_step {
        warn "$self->{inot}->poll err: $@\n" if $@;
 }
 
+# for graceful shutdown in PublicInbox::Daemon,
+# just ensure the FD gets closed ASAP and subscribers
+sub busy { 0 }
+
 1;
index d6042d18758def810762ab812a04e0442d5aa1a7..b24720eb9dd0c323158995b0a4c3532e1829ba6d 100644 (file)
--- a/t/nntpd.t
+++ b/t/nntpd.t
@@ -316,23 +316,6 @@ Date: Fri, 02 Oct 1993 00:00:00 +0000
                my @xap = grep m!Search/Xapian!, @of;
                is_deeply(\@xap, [], 'Xapian not loaded in nntpd');
        }
-       {
-               setsockopt($s, IPPROTO_TCP, TCP_NODELAY, 1);
-               syswrite($s, 'HDR List-id 1-');
-               select(undef, undef, undef, 0.15);
-               ok($td->kill, 'killed nntpd');
-               select(undef, undef, undef, 0.15);
-               syswrite($s, "\r\n");
-               $buf = '';
-               do {
-                       sysread($s, $buf, 4096, length($buf));
-               } until ($buf =~ /\r\n\z/);
-               my @r = split("\r\n", $buf);
-               like($r[0], qr/^5\d\d /,
-                       'got 5xx response for unoptimized HDR');
-               is(scalar @r, 1, 'only one response line');
-       }
-
        # -compact requires Xapian
        SKIP: {
                require_mods('Search::Xapian', 2);
@@ -356,7 +339,22 @@ Date: Fri, 02 Oct 1993 00:00:00 +0000
                my @of = xqx([$lsof, '-p', $td->{pid}], undef, $noerr);
                is(scalar(grep(/\(deleted\)/, @of)), 0, 'no deleted files');
        };
-
+       {
+               setsockopt($s, IPPROTO_TCP, TCP_NODELAY, 1);
+               syswrite($s, 'HDR List-id 1-');
+               select(undef, undef, undef, 0.15);
+               ok($td->kill, 'killed nntpd');
+               select(undef, undef, undef, 0.15);
+               syswrite($s, "\r\n");
+               $buf = '';
+               do {
+                       sysread($s, $buf, 4096, length($buf));
+               } until ($buf =~ /\r\n\z/);
+               my @r = split("\r\n", $buf);
+               like($r[0], qr/^5\d\d /,
+                       'got 5xx response for unoptimized HDR');
+               is(scalar @r, 1, 'only one response line');
+       }
        $n = $s = undef;
        $td->join;
        is($?, 0, 'no error in exited process');