Distinguish between AcquireExternalFD and epoll_create1 / kqueue failing
authorAndres Freund <andres@anarazel.de>
Tue, 26 Nov 2024 17:20:59 +0000 (12:20 -0500)
committerAndres Freund <andres@anarazel.de>
Tue, 26 Nov 2024 17:44:47 +0000 (12:44 -0500)
The error messages in CreateWaitEventSet() made it hard to know whether the
syscall or AcquireExternalFD() failed. This is particularly relevant because
AcquireExternalFD() imposes a lower limit than what would cause syscalls fail
with EMFILE.

I did not change the message in libpqsrv_connect_prepare(), which is the one
other use of AcquireExternalFD() in our codebase, as the error message already
is less ambiguous.

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/xjjx7r4xa7beixuu4qtkdhnwdbchrrpo3gaeb3jsbinvvdiat5@cwjw55mna5of

src/backend/storage/ipc/latch.c

index 608eb66abedf3d6afc76a36351047fcc4c0ef01c..f19ce5e7aff0b2cc0f9f47cd8b6347e298bd1ece 100644 (file)
@@ -811,10 +811,7 @@ CreateWaitEventSet(ResourceOwner resowner, int nevents)
 
 #if defined(WAIT_USE_EPOLL)
    if (!AcquireExternalFD())
-   {
-       /* treat this as though epoll_create1 itself returned EMFILE */
-       elog(ERROR, "epoll_create1 failed: %m");
-   }
+       elog(ERROR, "AcquireExternalFD, for epoll_create1, failed: %m");
    set->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
    if (set->epoll_fd < 0)
    {
@@ -823,10 +820,7 @@ CreateWaitEventSet(ResourceOwner resowner, int nevents)
    }
 #elif defined(WAIT_USE_KQUEUE)
    if (!AcquireExternalFD())
-   {
-       /* treat this as though kqueue itself returned EMFILE */
-       elog(ERROR, "kqueue failed: %m");
-   }
+       elog(ERROR, "AcquireExternalFD, for kqueue, failed: %m");
    set->kqueue_fd = kqueue();
    if (set->kqueue_fd < 0)
    {