From 0c7efd975754b41bccabbb55902b6d79bd350515 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 11 Jun 2021 19:07:32 -0400 Subject: [PATCH] Report sort phase progress in parallel btree build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We were already reporting it, but only after the parallel workers were finished, which is visibly much later than what happens in a serial build. With this change we report it when the leader starts its own sort phase when participating in the build (the normal case). Now this might happen a little later than when the workers start their sorting phases, but a) communicating the actual phase start from workers is likely to be a hassle, and b) the sort phase start is pretty fuzzy anyway, since sorting per se is actually initiated by tuplesort.c internally earlier than tuplesort_performsort() is called. Backpatch to pg12, where the progress reporting code for CREATE INDEX went in. Reported-by: Tomas Vondra Author: Matthias van de Meent Reviewed-by: Greg Nancarrow Reviewed-by: Álvaro Herrera Discussion: https://postgr.es/m/1128176d-1eee-55d4-37ca-e63644422adb --- src/backend/access/nbtree/nbtsort.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index 286d2cc93f1..d177b9f2338 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -562,6 +562,7 @@ _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2) } #endif /* BTREE_BUILD_STATS */ + /* Execute the sort */ pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE, PROGRESS_BTREE_PHASE_PERFORMSORT_1); tuplesort_performsort(btspool->sortstate); @@ -1833,16 +1834,18 @@ _bt_parallel_scan_and_sort(BTSpool *btspool, BTSpool *btspool2, true, progress, _bt_build_callback, (void *) &buildstate, scan); - /* - * Execute this worker's part of the sort. - * - * Unlike leader and serial cases, we cannot avoid calling - * tuplesort_performsort() for spool2 if it ends up containing no dead - * tuples (this is disallowed for workers by tuplesort). - */ + /* Execute this worker's part of the sort */ + if (progress) + pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE, + PROGRESS_BTREE_PHASE_PERFORMSORT_1); tuplesort_performsort(btspool->sortstate); if (btspool2) + { + if (progress) + pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE, + PROGRESS_BTREE_PHASE_PERFORMSORT_2); tuplesort_performsort(btspool2->sortstate); + } /* * Done. Record ambuild statistics, and whether we encountered a broken