postgrespro.git / summary / log / commit / refs

commit    56f8f9624ba050c7c47dd97547b7fafb866f2bdd
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Tue Aug 20 07:10:20 2019 +0000

    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 5f38403 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.  51c3e9f fixed a similar set of issues.
    
    Bug: #15964
    Reported-by: Sean Farrell
    Discussion: https://postgr.es/m/15964-c1753bdfed722e04@postgresql.org


src/bin/scripts/reindexdb.c | 4 ++-- src/bin/scripts/scripts_parallel.c | 14 ++++++++++++++ src/bin/scripts/scripts_parallel.h | 2 ++ src/bin/scripts/vacuumdb.c | 4 ++-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index 14a4f4a91c..f93f7dd5fe 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -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; diff --git a/src/bin/scripts/scripts_parallel.c b/src/bin/scripts/scripts_parallel.c index ffdc4e49ef..10379a1f99 100644 --- a/src/bin/scripts/scripts_parallel.c +++ b/src/bin/scripts/scripts_parallel.c @@ -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. diff --git a/src/bin/scripts/scripts_parallel.h b/src/bin/scripts/scripts_parallel.h index ab82c5e6a9..8042345072 100644 --- a/src/bin/scripts/scripts_parallel.h +++ b/src/bin/scripts/scripts_parallel.h @@ -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, diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index d81bfa3a6b..c5c38692ed 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -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; [parent: 0431a7874692]