]> Sergey Matveev's repositories - public-inbox.git/commitdiff
dskqxs: ignore EV_SET errors on EVFILT_WRITE
authorEric Wong <e@yhbt.net>
Sat, 11 Apr 2020 10:53:28 +0000 (10:53 +0000)
committerEric Wong <e@yhbt.net>
Wed, 15 Apr 2020 10:16:05 +0000 (10:16 +0000)
Just like the EPOLL_CTL_ADD emulation path, the EPOLL_CTL_MOD
and EPOLL_CTL_DEL emulation paths can fail if attempting to
install an EVFILT_WRITE for a read-only pipe.

I've only observed this on the EPOLL_CTL_DEL emulation path, but
I suspect it could happen on the EPOLL_CTL_MOD path as well.

Increasing the amount of read-only pipes we rely on with altid
exports via sqlite3 made this old bug more apparent and
reproducible while looping the test suite.

This may be adjusted in the future to deal with write-only
pipes, but we currently don't have any of those watched by
kqueue.

lib/PublicInbox/DSKQXS.pm

index b9b0b6c5dfbae3f29dd61a10a4778d41a37e8f1a..35cdecda8985965578c5aa4283885dd384596afb 100644 (file)
@@ -105,10 +105,10 @@ sub epoll_ctl {
        my $kq = $self->{kq};
        if ($op == EPOLL_CTL_MOD) {
                $kq->EV_SET($fd, EVFILT_READ, kq_flag(EPOLLIN, $ev));
-               $kq->EV_SET($fd, EVFILT_WRITE, kq_flag(EPOLLOUT, $ev));
+               eval { $kq->EV_SET($fd, EVFILT_WRITE, kq_flag(EPOLLOUT, $ev)) };
        } elsif ($op == EPOLL_CTL_DEL) {
                $kq->EV_SET($fd, EVFILT_READ, EV_DISABLE);
-               $kq->EV_SET($fd, EVFILT_WRITE, EV_DISABLE);
+               eval { $kq->EV_SET($fd, EVFILT_WRITE, EV_DISABLE) };
        } else { # EPOLL_CTL_ADD
                $kq->EV_SET($fd, EVFILT_READ, EV_ADD|kq_flag(EPOLLIN, $ev));