From 0ba4f51ae63e9b8b4d6987d52465f2a284820d4d Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Date: Tue, 4 Feb 2025 09:05:33 +0000
Subject: [PATCH v16 1/2] Introduce analyze_delay_point()

Currently vacuum_delay_point() is being used in analyze code paths.
This commit introduces analyze_delay_point() to make the analyze/vacuum split
clear. The "is_analyze" bool passed as a parameter to the new
vacuum_delay_point_internal is not being used (but will be used in a following
commit tracking the timing of cost-based vacuum/analyze delay).
---
 contrib/file_fdw/file_fdw.c                   |  2 +-
 src/backend/commands/analyze.c                | 10 +++----
 src/backend/commands/vacuum.c                 | 29 +++++++++++++++----
 src/backend/tsearch/ts_typanalyze.c           |  2 +-
 src/backend/utils/adt/array_typanalyze.c      |  2 +-
 src/backend/utils/adt/rangetypes_typanalyze.c |  2 +-
 src/include/commands/vacuum.h                 |  1 +
 7 files changed, 34 insertions(+), 14 deletions(-)
   3.9% contrib/file_fdw/
  81.1% src/backend/commands/
   3.9% src/backend/tsearch/
   7.8% src/backend/utils/adt/
   3.1% src/include/commands/

diff --git a/contrib/file_fdw/file_fdw.c b/contrib/file_fdw/file_fdw.c
index 678e754b2b9..44dfb5c5a54 100644
--- a/contrib/file_fdw/file_fdw.c
+++ b/contrib/file_fdw/file_fdw.c
@@ -1237,7 +1237,7 @@ file_acquire_sample_rows(Relation onerel, int elevel,
 	for (;;)
 	{
 		/* Check for user-requested abort or sleep */
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		/* Fetch next row */
 		MemoryContextReset(tupcontext);
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index f8da32e9aef..e177c6c3da5 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -915,7 +915,7 @@ compute_index_stats(Relation onerel, double totalrows,
 		{
 			HeapTuple	heapTuple = rows[rowno];
 
-			vacuum_delay_point();
+			analyze_delay_point();
 
 			/*
 			 * Reset the per-tuple context each time, to reclaim any cruft
@@ -1234,7 +1234,7 @@ acquire_sample_rows(Relation onerel, int elevel,
 	/* Outer loop over blocks to sample */
 	while (table_scan_analyze_next_block(scan, stream))
 	{
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		while (table_scan_analyze_next_tuple(scan, OldestXmin, &liverows, &deadrows, slot))
 		{
@@ -1966,7 +1966,7 @@ compute_trivial_stats(VacAttrStatsP stats,
 		Datum		value;
 		bool		isnull;
 
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		value = fetchfunc(stats, i, &isnull);
 
@@ -2082,7 +2082,7 @@ compute_distinct_stats(VacAttrStatsP stats,
 		int			firstcount1,
 					j;
 
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		value = fetchfunc(stats, i, &isnull);
 
@@ -2429,7 +2429,7 @@ compute_scalar_stats(VacAttrStatsP stats,
 		Datum		value;
 		bool		isnull;
 
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		value = fetchfunc(stats, i, &isnull);
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..4563e617505 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -2352,13 +2352,14 @@ vac_close_indexes(int nindexes, Relation *Irel, LOCKMODE lockmode)
 }
 
 /*
- * vacuum_delay_point --- check for interrupts and cost-based delay.
+ * vacuum_delay_point_internal --- check for interrupts and cost-based delay.
  *
- * This should be called in each major loop of VACUUM processing,
- * typically once per page processed.
+ * This should be called (through the vacuum_delay_point() or the analyze_delay_point()
+ * helpers) in each major loop of VACUUM/ANALYZE processing, typically once per
+ * page processed.
  */
-void
-vacuum_delay_point(void)
+static void
+vacuum_delay_point_internal(bool is_analyze)
 {
 	double		msec = 0;
 
@@ -2434,6 +2435,24 @@ vacuum_delay_point(void)
 	}
 }
 
+/*
+ * Helper function to implement delay points in non-analyze operations.
+ */
+void
+vacuum_delay_point(void)
+{
+	vacuum_delay_point_internal(false);
+}
+
+/*
+ * Helper function to implement delay points in analyze operations.
+ */
+void
+analyze_delay_point(void)
+{
+	vacuum_delay_point_internal(true);
+}
+
 /*
  * Computes the vacuum delay for parallel workers.
  *
diff --git a/src/backend/tsearch/ts_typanalyze.c b/src/backend/tsearch/ts_typanalyze.c
index 1494da1c9d3..133ec743495 100644
--- a/src/backend/tsearch/ts_typanalyze.c
+++ b/src/backend/tsearch/ts_typanalyze.c
@@ -204,7 +204,7 @@ compute_tsvector_stats(VacAttrStats *stats,
 		char	   *lexemesptr;
 		int			j;
 
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		value = fetchfunc(stats, vector_no, &isnull);
 
diff --git a/src/backend/utils/adt/array_typanalyze.c b/src/backend/utils/adt/array_typanalyze.c
index 44a6eb5dad0..0d1e0c7a582 100644
--- a/src/backend/utils/adt/array_typanalyze.c
+++ b/src/backend/utils/adt/array_typanalyze.c
@@ -314,7 +314,7 @@ compute_array_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
 		int			distinct_count;
 		bool		count_item_found;
 
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		value = fetchfunc(stats, array_no, &isnull);
 		if (isnull)
diff --git a/src/backend/utils/adt/rangetypes_typanalyze.c b/src/backend/utils/adt/rangetypes_typanalyze.c
index 9dc73af1992..81e72a29d28 100644
--- a/src/backend/utils/adt/rangetypes_typanalyze.c
+++ b/src/backend/utils/adt/rangetypes_typanalyze.c
@@ -167,7 +167,7 @@ compute_range_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
 					upper;
 		float8		length;
 
-		vacuum_delay_point();
+		analyze_delay_point();
 
 		value = fetchfunc(stats, range_no, &isnull);
 		if (isnull)
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..0d60bed0be4 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -340,6 +340,7 @@ extern bool vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
 extern bool vacuum_xid_failsafe_check(const struct VacuumCutoffs *cutoffs);
 extern void vac_update_datfrozenxid(void);
 extern void vacuum_delay_point(void);
+extern void analyze_delay_point(void);
 extern bool vacuum_is_permitted_for_relation(Oid relid, Form_pg_class reltuple,
 											 bits32 options);
 extern Relation vacuum_open_relation(Oid relid, RangeVar *relation,
-- 
2.34.1

