Commit 56f8f962 authored by Michael Paquier's avatar Michael Paquier

Fix compilation failure of vacuumdb and reindexdb with OpenBSD

FD_SETSIZE is included in sys/select.h per POSIX, and this header
inclusion has been moved to scripts_parallel.c as of 5f384037 without
moving the variable, causing a compilation failure on recent versions of
OpenBSD (6.6 was the version used in the report).

In order to take care of the failure, move FD_SETSIZE directly to
scripts_parallel.c with a wrapper controlling the maximum number of
parallel slots supported, based on a suggestion by Andres Freund.

While on it, reduce the maximum number to be less than FD_SETSIZE,
leaving some room for stdin, stdout and such as they consume some file
descriptors.

The buildfarm did not complain about that, as it happens to only be
an issue on recent versions of OpenBSD and there is no coverage in this
area.  51c3e9fa fixed a similar set of issues.

Bug: #15964
Reported-by: Sean Farrell
Discussion: https://postgr.es/m/15964-c1753bdfed722e04@postgresql.org
parent 0431a787
......@@ -153,10 +153,10 @@ main(int argc, char *argv[])
pg_log_error("number of parallel jobs must be at least 1");
exit(1);
}
if (concurrentCons > FD_SETSIZE - 1)
if (concurrentCons > ParallelSlotsMax())
{
pg_log_error("too many parallel jobs requested (maximum: %d)",
FD_SETSIZE - 1);
ParallelSlotsMax());
exit(1);
}
break;
......
......@@ -94,6 +94,20 @@ select_loop(int maxFd, fd_set *workerset, bool *aborting)
return i;
}
/*
* ParallelSlotsMax
* Returns the maximum number of parallel slots supported.
*
* Note that this is included here as FD_SETSIZE is declared in sys/select.h
* per POSIX.
*/
int
ParallelSlotsMax(void)
{
/* leave some room for pre-existing fds */
return FD_SETSIZE - 10;
}
/*
* ParallelSlotsGetIdle
* Return a connection slot that is ready to execute a command.
......
......@@ -21,6 +21,8 @@ typedef struct ParallelSlot
bool isFree; /* Is it known to be idle? */
} ParallelSlot;
extern int ParallelSlotsMax(void);
extern ParallelSlot *ParallelSlotsGetIdle(ParallelSlot *slots, int numslots);
extern ParallelSlot *ParallelSlotsSetup(const char *dbname, const char *host,
......
......@@ -181,10 +181,10 @@ main(int argc, char *argv[])
pg_log_error("number of parallel jobs must be at least 1");
exit(1);
}
if (concurrentCons > FD_SETSIZE - 1)
if (concurrentCons > ParallelSlotsMax())
{
pg_log_error("too many parallel jobs requested (maximum: %d)",
FD_SETSIZE - 1);
ParallelSlotsMax());
exit(1);
}
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment