v3-0005-handle-ParallelSlotGetIdle-inside-run_vacuum_comm.patch

text/x-patch

Filename: v3-0005-handle-ParallelSlotGetIdle-inside-run_vacuum_comm.patch
Type: text/x-patch
Part: 4
Message: Re: vacuumdb: add --dry-run

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v3-0005
Subject: handle ParallelSlotGetIdle() inside run_vacuum_command()
File+
src/bin/scripts/vacuuming.c 20 21
From ebd78b3a71c99ae36d934f844c36296407e3e23e Mon Sep 17 00:00:00 2001
From: Corey Huinker <corey.huinker@gmail.com>
Date: Wed, 19 Nov 2025 19:50:05 -0500
Subject: [PATCH v3 5/5] handle ParallelSlotGetIdle() inside
 run_vacuum_command()

---
 src/bin/scripts/vacuuming.c | 41 ++++++++++++++++++-------------------
 1 file changed, 20 insertions(+), 21 deletions(-)

diff --git a/src/bin/scripts/vacuuming.c b/src/bin/scripts/vacuuming.c
index 14d843bed10..5bd7ade62a1 100644
--- a/src/bin/scripts/vacuuming.c
+++ b/src/bin/scripts/vacuuming.c
@@ -43,7 +43,7 @@ static SimpleStringList *retrieve_objects(PGconn *conn,
 static void free_retrieved_objects(SimpleStringList *list);
 static void prepare_vacuum_command(int serverVersion, PQExpBuffer sql,
 								   vacuumingOptions *vacopts, const char *table);
-static void run_vacuum_command(ParallelSlot *free_slot, const char *sql,
+static bool run_vacuum_command(ParallelSlotArray *sa, const char *sql,
 							   bool echo, bool dry_run, const char *table);
 
 /*
@@ -362,7 +362,6 @@ vacuum_one_database(ConnParams *cparams,
 	do
 	{
 		const char *tabname = cell->val;
-		ParallelSlot *free_slot;
 
 		if (CancelRequested)
 		{
@@ -370,19 +369,14 @@ vacuum_one_database(ConnParams *cparams,
 			goto finish;
 		}
 
-		free_slot = ParallelSlotsGetIdle(sa, NULL);
-		if (!free_slot)
+		prepare_vacuum_command(serverVersion, &sql, vacopts, tabname);
+
+		if (!run_vacuum_command(sa, sql.data, echo, vacopts->dry_run, tabname))
 		{
 			ret = EXIT_FAILURE;
 			goto finish;
 		}
 
-		prepare_vacuum_command(serverVersion, &sql,
-							   vacopts, tabname);
-
-		run_vacuum_command(free_slot, sql.data,
-							echo, vacopts->dry_run, tabname);
-
 		cell = cell->next;
 	} while (cell != NULL);
 
@@ -396,16 +390,13 @@ vacuum_one_database(ConnParams *cparams,
 	if (vacopts->mode == MODE_VACUUM && vacopts->skip_database_stats)
 	{
 		const char *cmd = "VACUUM (ONLY_DATABASE_STATS);";
-		ParallelSlot *free_slot = ParallelSlotsGetIdle(sa, NULL);
 
-		if (!free_slot)
+		if (!run_vacuum_command(sa, cmd, echo, vacopts->dry_run, NULL))
 		{
 			ret = EXIT_FAILURE;
 			goto finish;
 		}
 
-		run_vacuum_command(free_slot, cmd, echo, vacopts->dry_run, NULL);
-
 		if (!ParallelSlotsWaitCompletion(sa))
 			ret = EXIT_FAILURE; /* error already reported by handler */
 	}
@@ -995,24 +986,29 @@ prepare_vacuum_command(int serverVersion, PQExpBuffer sql,
  *
  * Any errors during command execution are reported to stderr.
  */
-static void
-run_vacuum_command(ParallelSlot *free_slot, const char *sql, bool echo,
+static bool
+run_vacuum_command(ParallelSlotArray *sa, const char *sql, bool echo,
 				   bool dry_run, const char *table)
+
 {
+	ParallelSlot *free_slot;
 	bool		status;
-	PGconn	   *conn = free_slot->connection;
+	PGconn	   *conn;
 
 	if (dry_run)
 	{
 		/*
-		 * Print the command that we would have run in a real run,
-		 * the immediately mark the unused slot as free again.
+		 * Print the command that we would have run in a real run.
 		 */
 		printf("not executed: %s\n", sql);
-		free_slot->inUse = false;
-		return;
+		return true;
 	}
 
+	free_slot = ParallelSlotsGetIdle(sa, NULL);
+
+	if (!free_slot)
+		return false;
+
 	/*
 	 * Execute the vacuum.  All errors are handled in processQueryResult
 	 * through ParallelSlotsGetIdle.
@@ -1022,6 +1018,7 @@ run_vacuum_command(ParallelSlot *free_slot, const char *sql, bool echo,
 	if (echo)
 		printf("%s\n", sql);
 
+	conn = free_slot->connection;
 	status = PQsendQuery(conn, sql) == 1;
 
 	if (!status)
@@ -1037,6 +1034,8 @@ run_vacuum_command(ParallelSlot *free_slot, const char *sql, bool echo,
 						 PQdb(conn), PQerrorMessage(conn));
 		}
 	}
+
+	return true;
 }
 
 /*
-- 
2.51.1