diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c index 6a3a00585f9..cb42d4e572f 100644 --- a/src/backend/commands/vacuumparallel.c +++ b/src/backend/commands/vacuumparallel.c @@ -656,7 +656,7 @@ parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scan nworkers = Min(nworkers, pvs->pcxt->nworkers); /* - * Reserve workers in autovacuum global state. Note, that we may be given + * Reserve workers in autovacuum global state. Note that we may be given * fewer workers than we requested. */ if (AmAutoVacuumWorkerProcess() && nworkers > 0) @@ -706,15 +706,12 @@ parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scan LaunchParallelWorkers(pvs->pcxt); - if (AmAutoVacuumWorkerProcess() && - pvs->pcxt->nworkers_launched < nworkers) - { - /* - * Tell autovacuum that we could not launch all the previously - * reserved workers. - */ + /* + * Tell autovacuum that we could not launch all the previously + * reserved workers. + */ + if (AmAutoVacuumWorkerProcess() && pvs->pcxt->nworkers_launched < nworkers) AutoVacuumReleaseParallelWorkers(nworkers - pvs->pcxt->nworkers_launched); - } if (pvs->pcxt->nworkers_launched > 0) { @@ -765,7 +762,7 @@ parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scan for (int i = 0; i < pvs->pcxt->nworkers_launched; i++) InstrAccumParallelQuery(&pvs->buffer_usage[i], &pvs->wal_usage[i]); - /* Also release all previously reserved parallel autovacuum workers */ + /* Release all the reserved parallel workers for autovacuum */ if (AmAutoVacuumWorkerProcess() && pvs->pcxt->nworkers_launched > 0) AutoVacuumReleaseParallelWorkers(pvs->pcxt->nworkers_launched); } diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index bc11970bfee..6ccc88c4e1e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -152,8 +152,9 @@ static double av_storage_param_cost_delay = -1; static int av_storage_param_cost_limit = -1; /* - * Variable to keep number of currently reserved parallel autovacuum workers. - * It is only relevant for parallel autovacuum leader process. + * Tracks the number of parallel workers currently reserved by the + * autovacuum worker. This is non-zero only for the parallel autovacuum + * leader process. */ static int av_nworkers_reserved = 0; @@ -3407,33 +3408,24 @@ AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId, } /* - * In order to meet the 'autovacuum_max_parallel_workers' limit, leader - * autovacuum process must call this function during computing the parallel - * degree. + * Reserves parallel workers for autovacuum. * - * 'nworkers' is the desired number of parallel workers to reserve. Function - * sets 'nworkers' to the number of parallel workers that actually can be - * launched and reserves these workers (if any) in global autovacuum state. - * - * NOTE: We will try to provide as many workers as requested, even if caller - * will occupy all available workers. + * 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. */ void AutoVacuumReserveParallelWorkers(int *nworkers) { - /* Only leader worker can call this function. */ + /* Only leader autovacuum worker can call this function. */ Assert(AmAutoVacuumWorkerProcess() && !IsParallelWorker()); - /* - * We can only reserve workers at the beginning of parallel index - * processing, so we must not have any reserved workers right now. - */ + /* The worker must not have any reserved workers yet */ Assert(av_nworkers_reserved == 0); LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE); /* Provide as many workers as we can. */ - *nworkers= Min(AutoVacuumShmem->av_freeParallelWorkers, *nworkers); + *nworkers = Min(AutoVacuumShmem->av_freeParallelWorkers, *nworkers); AutoVacuumShmem->av_freeParallelWorkers -= *nworkers; /* Remember how many workers we have reserved. */ @@ -3632,8 +3624,8 @@ check_av_worker_gucs(void) } /* - * Make sure that number of free parallel workers corresponds to the - * autovacuum_max_parallel_workers parameter (after it was changed). + * Adjusts the number of free parallel workers corresponds to the new + * autovacuum_max_parallel_workers value. */ static void adjust_free_parallel_workers(int prev_max_parallel_workers)