From 75e57cbfbf4edbfcff0a8e02d83656403d5126f3 Mon Sep 17 00:00:00 2001
From: Hari Babu <kommi.haribabu@gmail.com>
Date: Tue, 19 Mar 2019 17:03:31 +1100
Subject: [PATCH] Avoid counting parallel worker transactions stats

The transactions that are started and committed by the parallel
workers should not be considered as actual transactions that are
committed. Currently this counter gets incremented only by the
outer transactions and internal operations like autovacuum and
etc.
---
 src/backend/access/transam/twophase.c |  2 +-
 src/backend/access/transam/xact.c     |  4 ++--
 src/backend/postmaster/pgstat.c       | 14 +++++++++++++-
 src/include/pgstat.h                  |  2 +-
 4 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index 21986e48fe..5a892bc057 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -1601,7 +1601,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
 	LWLockRelease(TwoPhaseStateLock);
 
 	/* Count the prepared xact as committed or aborted */
-	AtEOXact_PgStat(isCommit);
+	AtEOXact_PgStat(isCommit, false);
 
 	/*
 	 * And now we can clean up any files we may have left.
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index c3214d4f4d..5b9dd5a250 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -2152,7 +2152,7 @@ CommitTransaction(void)
 	AtEOXact_Files(true);
 	AtEOXact_ComboCid();
 	AtEOXact_HashTables(true);
-	AtEOXact_PgStat(true);
+	AtEOXact_PgStat(true, is_parallel_worker);
 	AtEOXact_Snapshot(true, false);
 	AtEOXact_ApplyLauncher(true);
 	pgstat_report_xact_timestamp(0);
@@ -2645,7 +2645,7 @@ AbortTransaction(void)
 		AtEOXact_Files(false);
 		AtEOXact_ComboCid();
 		AtEOXact_HashTables(false);
-		AtEOXact_PgStat(false);
+		AtEOXact_PgStat(false, is_parallel_worker);
 		AtEOXact_ApplyLauncher(false);
 		pgstat_report_xact_timestamp(0);
 	}
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 2a8472b91a..dd9cd6d1f5 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -2089,10 +2089,22 @@ pgstat_update_heap_dead_tuples(Relation rel, int delta)
  * ----------
  */
 void
-AtEOXact_PgStat(bool isCommit)
+AtEOXact_PgStat(bool isCommit, bool parallel)
 {
 	PgStat_SubXactStatus *xact_state;
 
+	/*
+	 * Don't count parallel worker stats, just release the resources.
+	 */
+	if (parallel)
+	{
+		pgStatXactStack = NULL;
+
+		/* Make sure any stats snapshot is thrown away */
+		pgstat_clear_snapshot();
+		return;
+	}
+
 	/*
 	 * Count transaction commit or abort.  (We use counters, not just bools,
 	 * in case the reporting message isn't sent right away.)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index c080fa6388..0249c4bbef 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -1355,7 +1355,7 @@ extern void pgstat_init_function_usage(FunctionCallInfo fcinfo,
 extern void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu,
 						  bool finalize);
 
-extern void AtEOXact_PgStat(bool isCommit);
+extern void AtEOXact_PgStat(bool isCommit, bool parallel);
 extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth);
 
 extern void AtPrepare_PgStat(void);
-- 
2.20.1.windows.1

