diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index f93f7dd5fe..f00aec15de 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -153,12 +153,6 @@ main(int argc, char *argv[]) pg_log_error("number of parallel jobs must be at least 1"); exit(1); } - if (concurrentCons > ParallelSlotsMax()) - { - pg_log_error("too many parallel jobs requested (maximum: %d)", - ParallelSlotsMax()); - exit(1); - } break; case 'v': verbose = true; diff --git a/src/bin/scripts/scripts_parallel.c b/src/bin/scripts/scripts_parallel.c index 10379a1f99..55bda9044b 100644 --- a/src/bin/scripts/scripts_parallel.c +++ b/src/bin/scripts/scripts_parallel.c @@ -94,20 +94,6 @@ 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. @@ -246,6 +232,18 @@ ParallelSlotsSetup(const char *dbname, const char *host, const char *port, { conn = connectDatabase(dbname, host, port, username, prompt_password, progname, echo, false, true); + + /* + * Fail and exit immediately if trying to use a socket in an + * unsupported range. POSIX requires open(2) to use the lowest + * unused file descriptor and the hint given relies on that. + */ + if (PQsocket(conn) >= FD_SETSIZE) + { + pg_log_fatal("too many jobs for this platform -- try %d", i); + exit(1); + } + init_slot(slots + i, conn); } } diff --git a/src/bin/scripts/scripts_parallel.h b/src/bin/scripts/scripts_parallel.h index 8042345072..ab82c5e6a9 100644 --- a/src/bin/scripts/scripts_parallel.h +++ b/src/bin/scripts/scripts_parallel.h @@ -21,8 +21,6 @@ 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 c5c38692ed..2c7219239f 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -181,12 +181,6 @@ main(int argc, char *argv[]) pg_log_error("number of parallel jobs must be at least 1"); exit(1); } - if (concurrentCons > ParallelSlotsMax()) - { - pg_log_error("too many parallel jobs requested (maximum: %d)", - ParallelSlotsMax()); - exit(1); - } break; case 2: maintenance_db = pg_strdup(optarg);