From 6a435ea20193ba92f457a9a3c30d154cd0a74f5f Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sun, 16 Feb 2020 20:25:13 -0600
Subject: [PATCH v23 2/3] add callback for truncation

---
 src/backend/access/heap/vacuumlazy.c | 21 ++++++++++++++++++++-
 src/include/commands/progress.h      |  1 +
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index f15326a24c..d10a1bcc96 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -2572,6 +2572,10 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats)
 			return;
 		}
 
+		/* Setup error traceback support for ereport() */
+		update_vacuum_error_cbarg(vacrelstats,
+				PROGRESS_VACUUM_PHASE_TRUNCATE, new_rel_pages, NULL);
+
 		/*
 		 * Okay to truncate.
 		 */
@@ -2688,6 +2692,10 @@ count_nondeletable_pages(Relation onerel, LVRelStats *vacrelstats)
 			prefetchStart = blkno & ~(PREFETCH_SIZE - 1);
 			for (pblkno = prefetchStart; pblkno <= blkno; pblkno++)
 			{
+				/* Setup error traceback support for ereport() */
+				update_vacuum_error_cbarg(vacrelstats,
+						PROGRESS_VACUUM_PHASE_TRUNCATE_PREFETCH, pblkno, NULL);
+
 				PrefetchBuffer(onerel, MAIN_FORKNUM, pblkno);
 				CHECK_FOR_INTERRUPTS();
 			}
@@ -3474,8 +3482,19 @@ vacuum_error_callback(void *arg)
 					cbarg->relnamespace, cbarg->relname);
 			break;
 
-		case -1: /* Parallel worker not yet processing */
 		case PROGRESS_VACUUM_PHASE_TRUNCATE:
+			if (BlockNumberIsValid(cbarg->blkno))
+				errcontext("while truncating relation \"%s.%s\" to %u blocks",
+						cbarg->relnamespace, cbarg->relname, cbarg->blkno);
+			break;
+
+		case PROGRESS_VACUUM_PHASE_TRUNCATE_PREFETCH:
+			if (BlockNumberIsValid(cbarg->blkno))
+				errcontext("while prefetching block %u to truncate relation \"%s.%s\"",
+						cbarg->blkno, cbarg->relnamespace, cbarg->relname);
+			break;
+
+		case -1: /* Parallel worker not yet processing */
 		case PROGRESS_VACUUM_PHASE_FINAL_CLEANUP:
 		default:
 			return; /* Shouldn't happen: do nothing */
diff --git a/src/include/commands/progress.h b/src/include/commands/progress.h
index 5af2b8cc0c..c7eeaf8c48 100644
--- a/src/include/commands/progress.h
+++ b/src/include/commands/progress.h
@@ -34,6 +34,7 @@
 #define PROGRESS_VACUUM_PHASE_TRUNCATE			5
 #define PROGRESS_VACUUM_PHASE_FINAL_CLEANUP		6
 #define PROGRESS_VACUUM_PHASE_VACUUM_FSM		7 /* For error reporting only */
+#define PROGRESS_VACUUM_PHASE_TRUNCATE_PREFETCH		8 /* For error reporting only */
 
 /* Progress parameters for analyze */
 #define PROGRESS_ANALYZE_PHASE						0
-- 
2.17.0

