From 94fc3655b55cff3346a8afdf0bac2ee9b26fd035 Mon Sep 17 00:00:00 2001 From: "Sami Imseih (AWS)" Date: Thu, 14 Apr 2022 00:06:14 +0000 Subject: [PATCH v10 1/2] Add progress reporting callback to ParallelContext The purpose of supporting a progress reporting callback in ParallelContext is to allow for the leader process to report progress while waiting for workers to complete. The first use-case for this is to report index progress in pg_stat_progress_vacuum. --- src/backend/access/transam/parallel.c | 16 ++++++++++++++++ src/include/access/parallel.h | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index df0cd77558..bfe3275d8b 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -774,6 +774,22 @@ WaitForParallelWorkersToFinish(ParallelContext *pcxt) */ CHECK_FOR_INTERRUPTS(); + /* + * We call the parallel progress callback while + * waiting for the parallel workers to finish. + * This is to ensure that the leader keeps + * updating progress when waiting for + * parallel workers to finish. + * + * We must ensure that pcxt->parallel_progress_callback + * is set before calling as not all parallel + * operations will set a callback. + */ + if (pcxt->parallel_progress_callback) + { + pcxt->parallel_progress_callback(pcxt->parallel_progress_callback_arg); + } + for (i = 0; i < pcxt->nworkers_launched; ++i) { /* diff --git a/src/include/access/parallel.h b/src/include/access/parallel.h index 983841d45e..53a3d13ec0 100644 --- a/src/include/access/parallel.h +++ b/src/include/access/parallel.h @@ -20,6 +20,9 @@ #include "storage/shm_mq.h" #include "storage/shm_toc.h" +/* progress callback definition */ +typedef void (*ParallelProgressCallback) (void *parallel_progress_callback_state); + typedef void (*parallel_worker_main_type) (dsm_segment *seg, shm_toc *toc); typedef struct ParallelWorkerInfo @@ -46,6 +49,8 @@ typedef struct ParallelContext ParallelWorkerInfo *worker; int nknown_attached_workers; bool *known_attached_workers; + ParallelProgressCallback parallel_progress_callback; + void *parallel_progress_callback_arg; } ParallelContext; typedef struct ParallelWorkerContext -- 2.32.0