Re: pgsql: Add kqueue(2) support to the WaitEventSet API.
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: Alexander Korotkov <a.korotkov@postgrespro.ru>
Cc: Thomas Munro <tmunro@postgresql.org>, pgsql-committers <pgsql-committers@lists.postgresql.org>
Date: 2020-03-16T20:11:22Z
Lists: pgsql-hackers
On Tue, Mar 17, 2020 at 12:55 AM Alexander Korotkov <a.korotkov@postgrespro.ru> wrote: > On Wed, Feb 5, 2020 at 7:59 AM Thomas Munro <tmunro@postgresql.org> wrote: > > Add kqueue(2) support to the WaitEventSet API. > > > > Use kevent(2) to wait for events on the BSD family of operating > > systems and macOS. This is similar to the epoll(2) support added > > for Linux by commit 98a64d0bd. > > I'm not sure if it was already reported in this thread (it seems to be > not at the first glance), but I've discovered following issue on macos > 10.13.6. If backend is under lldb and does XactLockTableWait(), then > it does proc_exit(1). /me digs out a Macintosh Reproduced here. The problem seems to be that macOS's getppid() returns the debugger's PID, while the debugger is attached. This doesn't happen on FreeBSD (even though the debugger does internally become the parent, getppid() is careful to return the "real" parent PID so that user space doesn't notice this trickery; apparently Apple made a different choice). The getppid() check is there to close a vanishingly rare race condition: when creating a WaitEventSet, we ask the kernel to tell us when the postmaster exits, but there is a possibility that the postmaster has already exited; normally that causes an error with errno == ESRCH (no such PID, it's already gone), but another unrelated process might have started that has the same PID, so we check if our ppid has changed after a successful return code. That's not going to work under a debugger on this OS. Looking into some options.
Commits
-
Don't use EV_CLEAR for kqueue events.
- 9b8aa0929390 13.0 cited
-
Fix kqueue support under debugger on macOS.
- 7bc84a1f304a 13.0 landed
-
Account explicitly for long-lived FDs that are allocated outside fd.c.
- 3d475515a15f 13.0 landed
-
Add kqueue(2) support to the WaitEventSet API.
- 815c2f0972c8 13.0 cited
-
Introduce WaitEventSet API.
- 98a64d0bd713 9.6.0 cited