parallel-slot-fdlimit-v3.patch
text/x-diff
Filename: parallel-slot-fdlimit-v3.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
Series: patch v3
| File | + | − |
|---|---|---|
| src/bin/pgbench/pgbench.c | 1 | 1 |
| src/bin/scripts/reindexdb.c | 0 | 6 |
| src/bin/scripts/scripts_parallel.c | 12 | 14 |
| src/bin/scripts/scripts_parallel.h | 0 | 2 |
| src/bin/scripts/vacuumdb.c | 0 | 6 |
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 570cf3306a..fbf1370d61 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -6420,7 +6420,7 @@ add_socket_to_set(socket_set *sa, int fd, int idx)
* Doing a hard exit here is a bit grotty, but it doesn't seem worth
* complicating the API to make it less grotty.
*/
- fprintf(stderr, "too many client connections for select()\n");
+ fprintf(stderr, "too many jobs for this platform's select()\n");
exit(1);
}
FD_SET(fd, &sa->fds);
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..e0643bc914 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 immediately if trying to use an index in an unsupported
+ * range. Doing a hard exit here is not beautiful, but that's
+ * not worth complicating the logic.
+ */
+ if (PQsocket(conn) >= FD_SETSIZE)
+ {
+ fprintf(stderr, "too many jobs for this platform's select()\n");
+ 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);