diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c
index cb42d4e572f..1e35b82aeaf 100644
--- a/src/backend/commands/vacuumparallel.c
+++ b/src/backend/commands/vacuumparallel.c
@@ -764,7 +764,7 @@ parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scan
 
 		/* Release all the reserved parallel workers for autovacuum */
 		if (AmAutoVacuumWorkerProcess() && pvs->pcxt->nworkers_launched > 0)
-			AutoVacuumReleaseParallelWorkers(pvs->pcxt->nworkers_launched);
+			AutoVacuumReleaseAllParallelWorkers();
 	}
 
 	/*
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 097b1dd55cf..bdd663610f5 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -373,7 +373,6 @@ static void avl_sigusr2_handler(SIGNAL_ARGS);
 static bool av_worker_available(void);
 static void check_av_worker_gucs(void);
 static void adjust_free_parallel_workers(int prev_max_parallel_workers);
-static void AutoVacuumReleaseAllParallelWorkers(void);
 
 
 
@@ -3391,6 +3390,9 @@ AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId,
  *
  * nworkers is an in/out parameter; the requested number of parallel workers
  * to reserve by the caller, and set to the actual number of reserved workers.
+ *
+ * The caller must call AutoVacuumReleaseParallelWorkers() to release the
+ * reserved workers.
  */
 void
 AutoVacuumReserveParallelWorkers(int *nworkers)
@@ -3414,11 +3416,12 @@ AutoVacuumReserveParallelWorkers(int *nworkers)
 }
 
 /*
- * Leader autovacuum process must call this function in order to update global
- * autovacuum state, so other leaders will be able to use these parallel
- * workers.
+ * Releases the reserved parallel workers for autovacuum.
  *
- * 'nworkers' - how many workers caller wants to release.
+ * This function should be used to release the parallel workers that an
+ * autovacuum worker reserved by AutoVacuumReserveParallelWorkers(). nworkers
+ * is the number of workers to release, which must not be greater than the
+ * number of workers currently reserved, av_nworkers_reserved.
  */
 void
 AutoVacuumReleaseParallelWorkers(int nworkers)
@@ -3426,6 +3429,9 @@ AutoVacuumReleaseParallelWorkers(int nworkers)
 	/* Only leader worker can call this function. */
 	Assert(AmAutoVacuumWorkerProcess() && !IsParallelWorker());
 
+	/* Cannot release more workers than reserved */
+	Assert(nworkers <= av_nworkers_reserved);
+
 	LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE);
 
 	/*
@@ -3443,8 +3449,8 @@ AutoVacuumReleaseParallelWorkers(int nworkers)
 }
 
 /*
- * Same as above, but release *all* parallel workers, that were reserved by
- * current leader autovacuum process.
+ * Similar to AutoVacuumReleaseParallelWorkers(), but this function releases
+ * all the parallel workers that this autovacuum worker reserved.
  */
 static void
 AutoVacuumReleaseAllParallelWorkers(void)
@@ -3454,6 +3460,8 @@ AutoVacuumReleaseAllParallelWorkers(void)
 
 	if (av_nworkers_reserved > 0)
 		AutoVacuumReleaseParallelWorkers(av_nworkers_reserved);
+
+	Assert(av_nworkers_reserved == 0);
 }
 
 /*
diff --git a/src/include/postmaster/autovacuum.h b/src/include/postmaster/autovacuum.h
index 3f5b59a15bd..f3783afb51b 100644
--- a/src/include/postmaster/autovacuum.h
+++ b/src/include/postmaster/autovacuum.h
@@ -65,6 +65,7 @@ extern bool AutoVacuumRequestWork(AutoVacuumWorkItemType type,
 /* parallel autovacuum stuff */
 extern void	AutoVacuumReserveParallelWorkers(int *nworkers);
 extern void AutoVacuumReleaseParallelWorkers(int nworkers);
+extern void AutoVacuumReleaseAllParallelWorkers(void);
 
 /* shared memory stuff */
 extern Size AutoVacuumShmemSize(void);
