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);