aboutsummaryrefslogtreecommitdiff
path: root/src/bin/scripts
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2021-03-11 13:17:46 -0500
committerRobert Haas <rhaas@postgresql.org>2021-03-11 13:17:46 -0500
commitf71519e545a34ece0a27c8bb1a2b6e197d323163 (patch)
tree63c81c1ec99bcc7e7f616dc960a53004c7285e65 /src/bin/scripts
parent2c0cefcd18161549e9e8b103f46c0f65fca84d99 (diff)
downloadpostgresql-f71519e545a34ece0a27c8bb1a2b6e197d323163.tar.gz
postgresql-f71519e545a34ece0a27c8bb1a2b6e197d323163.zip
Refactor and generalize the ParallelSlot machinery.
Create a wrapper object, ParallelSlotArray, to encapsulate the number of slots and the slot array itself, plus some other relevant bits of information. This reduces the number of parameters we have to pass around all over the place. Allow for a ParallelSlotArray to contain slots connected to different databases within a single cluster. The current clients of this mechanism don't need this, but it is expected to be used by future patches. Defer connecting to databases until we actually need the connection for something. This is a slight behavior change for vacuumdb and reindexdb. If you specify a number of jobs that is larger than the number of objects, the extra connections will now not be used. But, on the other hand, if you specify a number of jobs that is so large that it's going to fail, the failure would previously have happened before any operations were actually started, and now it won't. Mark Dilger, reviewed by me. Discussion: http://postgr.es/m/12ED3DA8-25F0-4B68-937D-D907CFBF08E7@enterprisedb.com Discussion: http://postgr.es/m/BA592F2D-F928-46FF-9516-2B827F067F57@enterprisedb.com
Diffstat (limited to 'src/bin/scripts')
-rw-r--r--src/bin/scripts/reindexdb.c17
-rw-r--r--src/bin/scripts/vacuumdb.c46
2 files changed, 32 insertions, 31 deletions
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index cf281762431..fc0681538a9 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -36,7 +36,7 @@ static SimpleStringList *get_parallel_object_list(PGconn *conn,
ReindexType type,
SimpleStringList *user_list,
bool echo);
-static void reindex_one_database(const ConnParams *cparams, ReindexType type,
+static void reindex_one_database(ConnParams *cparams, ReindexType type,
SimpleStringList *user_list,
const char *progname,
bool echo, bool verbose, bool concurrently,
@@ -330,7 +330,7 @@ main(int argc, char *argv[])
}
static void
-reindex_one_database(const ConnParams *cparams, ReindexType type,
+reindex_one_database(ConnParams *cparams, ReindexType type,
SimpleStringList *user_list,
const char *progname, bool echo,
bool verbose, bool concurrently, int concurrentCons,
@@ -341,7 +341,7 @@ reindex_one_database(const ConnParams *cparams, ReindexType type,
bool parallel = concurrentCons > 1;
SimpleStringList *process_list = user_list;
ReindexType process_type = type;
- ParallelSlot *slots;
+ ParallelSlotArray *sa;
bool failed = false;
int items_count = 0;
@@ -461,7 +461,8 @@ reindex_one_database(const ConnParams *cparams, ReindexType type,
Assert(process_list != NULL);
- slots = ParallelSlotsSetup(cparams, progname, echo, conn, concurrentCons);
+ sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, NULL);
+ ParallelSlotsAdoptConn(sa, conn);
cell = process_list->head;
do
@@ -475,7 +476,7 @@ reindex_one_database(const ConnParams *cparams, ReindexType type,
goto finish;
}
- free_slot = ParallelSlotsGetIdle(slots, concurrentCons);
+ free_slot = ParallelSlotsGetIdle(sa, NULL);
if (!free_slot)
{
failed = true;
@@ -489,7 +490,7 @@ reindex_one_database(const ConnParams *cparams, ReindexType type,
cell = cell->next;
} while (cell != NULL);
- if (!ParallelSlotsWaitCompletion(slots, concurrentCons))
+ if (!ParallelSlotsWaitCompletion(sa))
failed = true;
finish:
@@ -499,8 +500,8 @@ finish:
pg_free(process_list);
}
- ParallelSlotsTerminate(slots, concurrentCons);
- pfree(slots);
+ ParallelSlotsTerminate(sa);
+ pfree(sa);
if (failed)
exit(1);
diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c
index 602fd45c429..7901c41f160 100644
--- a/src/bin/scripts/vacuumdb.c
+++ b/src/bin/scripts/vacuumdb.c
@@ -45,7 +45,7 @@ typedef struct vacuumingOptions
} vacuumingOptions;
-static void vacuum_one_database(const ConnParams *cparams,
+static void vacuum_one_database(ConnParams *cparams,
vacuumingOptions *vacopts,
int stage,
SimpleStringList *tables,
@@ -408,7 +408,7 @@ main(int argc, char *argv[])
* a list of tables from the database.
*/
static void
-vacuum_one_database(const ConnParams *cparams,
+vacuum_one_database(ConnParams *cparams,
vacuumingOptions *vacopts,
int stage,
SimpleStringList *tables,
@@ -421,13 +421,14 @@ vacuum_one_database(const ConnParams *cparams,
PGresult *res;
PGconn *conn;
SimpleStringListCell *cell;
- ParallelSlot *slots;
+ ParallelSlotArray *sa;
SimpleStringList dbtables = {NULL, NULL};
int i;
int ntups;
bool failed = false;
bool tables_listed = false;
bool has_where = false;
+ const char *initcmd;
const char *stage_commands[] = {
"SET default_statistics_target=1; SET vacuum_cost_delay=0;",
"SET default_statistics_target=10; RESET vacuum_cost_delay;",
@@ -684,26 +685,25 @@ vacuum_one_database(const ConnParams *cparams,
concurrentCons = 1;
/*
- * Setup the database connections. We reuse the connection we already have
- * for the first slot. If not in parallel mode, the first slot in the
- * array contains the connection.
+ * All slots need to be prepared to run the appropriate analyze stage, if
+ * caller requested that mode. We have to prepare the initial connection
+ * ourselves before setting up the slots.
*/
- slots = ParallelSlotsSetup(cparams, progname, echo, conn, concurrentCons);
+ if (stage == ANALYZE_NO_STAGE)
+ initcmd = NULL;
+ else
+ {
+ initcmd = stage_commands[stage];
+ executeCommand(conn, initcmd, echo);
+ }
/*
- * Prepare all the connections to run the appropriate analyze stage, if
- * caller requested that mode.
+ * Setup the database connections. We reuse the connection we already have
+ * for the first slot. If not in parallel mode, the first slot in the
+ * array contains the connection.
*/
- if (stage != ANALYZE_NO_STAGE)
- {
- int j;
-
- /* We already emitted the message above */
-
- for (j = 0; j < concurrentCons; j++)
- executeCommand((slots + j)->connection,
- stage_commands[stage], echo);
- }
+ sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, initcmd);
+ ParallelSlotsAdoptConn(sa, conn);
initPQExpBuffer(&sql);
@@ -719,7 +719,7 @@ vacuum_one_database(const ConnParams *cparams,
goto finish;
}
- free_slot = ParallelSlotsGetIdle(slots, concurrentCons);
+ free_slot = ParallelSlotsGetIdle(sa, NULL);
if (!free_slot)
{
failed = true;
@@ -740,12 +740,12 @@ vacuum_one_database(const ConnParams *cparams,
cell = cell->next;
} while (cell != NULL);
- if (!ParallelSlotsWaitCompletion(slots, concurrentCons))
+ if (!ParallelSlotsWaitCompletion(sa))
failed = true;
finish:
- ParallelSlotsTerminate(slots, concurrentCons);
- pg_free(slots);
+ ParallelSlotsTerminate(sa);
+ pg_free(sa);
termPQExpBuffer(&sql);