From 146d2ed10e43053174e0688d80481a2beca5379b Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Date: Fri, 28 Feb 2025 06:17:59 +0000
Subject: [PATCH v12 2/2] Add backend type check in
 pgstat_fetch_stat_backend_by_pid() and pg_stat_reset_backend_stats()

This is relevant specially since a051e71e28a where pgstat_tracks_backend_bktype()
has been modified for B_WAL_RECEIVER, B_WAL_SUMMARIZER and B_WAL_WRITER.
---
 src/backend/utils/activity/pgstat_backend.c | 19 ++++++++-----------
 src/backend/utils/activity/pgstat_wal.c     |  1 +
 src/backend/utils/adt/pgstatfuncs.c         | 21 +++++++++++++++------
 3 files changed, 24 insertions(+), 17 deletions(-)
  46.3% src/backend/utils/activity/
  53.6% src/backend/utils/adt/

diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c
index 641ba27c95b..13c4f3f29d6 100644
--- a/src/backend/utils/activity/pgstat_backend.c
+++ b/src/backend/utils/activity/pgstat_backend.c
@@ -111,18 +111,19 @@ pgstat_fetch_stat_backend_by_pid(int pid, BackendType *bktype)
 	if (bktype)
 		*bktype = B_INVALID;
 
-	/*
-	 * This could be an auxiliary process but these do not report backend
-	 * statistics due to pgstat_tracks_backend_bktype(), so there is no need
-	 * for an extra call to AuxiliaryPidGetProc().
-	 */
+	/* This could be an auxiliary process */
 	if (!proc)
-		return NULL;
+	{
+		proc = AuxiliaryPidGetProc(pid);
+		if (!proc)
+			return NULL;
+	}
 
 	procNumber = GetNumberFromPGProc(proc);
 
 	beentry = pgstat_get_beentry_by_proc_number(procNumber);
-	if (!beentry)
+	/* Check if the backend type tracks statistics */
+	if (!beentry || !pgstat_tracks_backend_bktype(beentry->st_backendType))
 		return NULL;
 
 	backend_stats = pgstat_fetch_stat_backend(procNumber);
@@ -133,10 +134,6 @@ pgstat_fetch_stat_backend_by_pid(int pid, BackendType *bktype)
 	if (beentry->st_procpid != pid)
 		return NULL;
 
-	/* backend may be gone, so recheck in case */
-	if (beentry->st_backendType == B_INVALID)
-		return NULL;
-
 	if (bktype)
 		*bktype = beentry->st_backendType;
 
diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c
index c1c2e6dc386..16a1ecb4d90 100644
--- a/src/backend/utils/activity/pgstat_wal.c
+++ b/src/backend/utils/activity/pgstat_wal.c
@@ -56,6 +56,7 @@ pgstat_report_wal(bool force)
 
 	/* flush IO stats */
 	pgstat_flush_io(nowait);
+	(void) pgstat_flush_backend(nowait, PGSTAT_BACKEND_FLUSH_IO);
 }
 
 /*
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 85061e29bd1..9ab0429e749 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -1941,19 +1941,28 @@ Datum
 pg_stat_reset_backend_stats(PG_FUNCTION_ARGS)
 {
 	PGPROC	   *proc;
+	PgBackendStatus *beentry;
+	ProcNumber	procNumber;
 	int			backend_pid = PG_GETARG_INT32(0);
 
 	proc = BackendPidGetProc(backend_pid);
 
-	/*
-	 * This could be an auxiliary process but these do not report backend
-	 * statistics due to pgstat_tracks_backend_bktype(), so there is no need
-	 * for an extra call to AuxiliaryPidGetProc().
-	 */
+	/* This could be an auxiliary process */
 	if (!proc)
+	{
+		proc = AuxiliaryPidGetProc(backend_pid);
+		if (!proc)
+			PG_RETURN_VOID();
+	}
+
+	procNumber = GetNumberFromPGProc(proc);
+
+	beentry = pgstat_get_beentry_by_proc_number(procNumber);
+	/* Check if the backend type tracks statistics */
+	if (!beentry || !pgstat_tracks_backend_bktype(beentry->st_backendType))
 		PG_RETURN_VOID();
 
-	pgstat_reset(PGSTAT_KIND_BACKEND, InvalidOid, GetNumberFromPGProc(proc));
+	pgstat_reset(PGSTAT_KIND_BACKEND, InvalidOid, procNumber);
 
 	PG_RETURN_VOID();
 }
-- 
2.34.1

