From fae3dd1f6bd97acb626a85120bb09e2b18b76f98 Mon Sep 17 00:00:00 2001
From: Daniil Davidov <d.davydov@postgrespro.ru>
Date: Wed, 18 Mar 2026 15:03:31 +0700
Subject: [PATCH 4/9] fixup for parallel autovacuum core

---
 src/backend/access/common/reloptions.c    |  2 +-
 src/backend/postmaster/autovacuum.c       | 12 +++++++++---
 src/backend/utils/misc/guc_parameters.dat |  4 ++--
 src/include/utils/rel.h                   |  7 ++++---
 4 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 9459a010cc3..055585c38f3 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -242,7 +242,7 @@ static relopt_int intRelOpts[] =
 			RELOPT_KIND_HEAP,
 			ShareUpdateExclusiveLock
 		},
-		-1, -1, 1024
+		0, -1, 1024
 	},
 	{
 		{
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index f153d0343c8..ff57d8fca2a 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2798,6 +2798,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		int			multixact_freeze_table_age;
 		int			log_vacuum_min_duration;
 		int			log_analyze_min_duration;
+		int			nparallel_workers = -1; /* disabled by default */
 
 		/*
 		 * Calculate the vacuum cost parameters and the freeze ages.  If there
@@ -2860,9 +2861,13 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.truncate = VACOPTVALUE_UNSPECIFIED;
 
 		/* Decide whether we need to process indexes of table in parallel. */
-		tab->at_params.nworkers = avopts
-			? avopts->autovacuum_parallel_workers
-			: -1;
+		if (avopts)
+		{
+			if (avopts->autovacuum_parallel_workers > 0)
+				nparallel_workers = avopts->autovacuum_parallel_workers;
+			else if (avopts->autovacuum_parallel_workers == -1)
+				nparallel_workers = 0;
+		}
 
 		tab->at_params.freeze_min_age = freeze_min_age;
 		tab->at_params.freeze_table_age = freeze_table_age;
@@ -2872,6 +2877,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.log_vacuum_min_duration = log_vacuum_min_duration;
 		tab->at_params.log_analyze_min_duration = log_analyze_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		tab->at_params.nworkers = nparallel_workers;
 
 		/*
 		 * Later, in vacuum_rel(), we check reloptions for any
diff --git a/src/backend/utils/misc/guc_parameters.dat b/src/backend/utils/misc/guc_parameters.dat
index 12393c1214b..9bd155e99f6 100644
--- a/src/backend/utils/misc/guc_parameters.dat
+++ b/src/backend/utils/misc/guc_parameters.dat
@@ -155,11 +155,11 @@
 },
 
 { name => 'autovacuum_max_parallel_workers', type => 'int', context => 'PGC_SIGHUP', group => 'VACUUM_AUTOVACUUM',
-  short_desc => 'Maximum number of parallel workers that a single autovacuum worker can take from bgworkers pool.',
+  short_desc => 'Maximum number of parallel processes per autovacuuming of one table.',
   variable => 'autovacuum_max_parallel_workers',
   boot_val => '2',
   min => '0',
-  max => 'MAX_BACKENDS',
+  max => 'MAX_PARALLEL_WORKER_LIMIT',
 },
 
 { name => 'autovacuum_max_workers', type => 'int', context => 'PGC_SIGHUP', group => 'VACUUM_AUTOVACUUM',
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 11dd3aebc6c..1981954008e 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -313,9 +313,10 @@ typedef struct AutoVacOpts
 	bool		enabled;
 
 	/*
-	 * Target number of parallel autovacuum workers. -1 by default disables
-	 * parallel vacuum during autovacuum. 0 means choose the parallel degree
-	 * based on the number of indexes.
+	 * Target number of parallel autovacuum workers. 0 by default disables
+	 * parallel vacuum during autovacuum. -1 means choose the parallel degree
+	 * based on the number of indexes (the autovacuum_max_parallel_workers
+	 * parameter will be used as a limit).
 	 */
 	int			autovacuum_parallel_workers;
 
-- 
2.43.0

