From: Amit Kapila Date: Wed, 10 Apr 2019 03:06:42 +0000 (+0530) Subject: Avoid counting transaction stats for parallel worker cooperating X-Git-Tag: REL_11_3~51 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=036f7d3782e53573d2080e7d967fff375bc516b5;p=thirdparty%2Fpostgresql.git Avoid counting transaction stats for parallel worker cooperating transaction. The transaction that is initiated by the parallel worker to cooperate with the actual transaction started by the main backend to complete the query execution should not be counted as a separate transaction. The other internal transactions started and committed by the parallel worker are still counted as separate transactions as we that is what we do in other places like autovacuum. This will partially fix the bloat in transaction stats due to additional transactions performed by parallel workers. For a complete fix, we need to decide how we want to show all the transactions that are started internally for various operations and that is a matter of separate patch. Reported-by: Haribabu Kommi Author: Haribabu Kommi Reviewed-by: Amit Kapila, Jamison Kirk and Rahila Syed Backpatch-through: 9.6 Discussion: https://postgr.es/m/CAJrrPGc9=jKXuScvNyQ+VNhO0FZk7LLAShAJRyZjnedd2D61EQ@mail.gmail.com --- diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 349d94a5e67..2af0832e500 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1574,7 +1574,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit) PredicateLockTwoPhaseFinish(xid, isCommit); /* 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 4cf5ffeedb4..c97862e7dc3 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -2164,7 +2164,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); @@ -2656,7 +2656,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 b8bad60a305..9a3864f0b0b 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2050,18 +2050,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; - /* - * Count transaction commit or abort. (We use counters, not just bools, - * in case the reporting message isn't sent right away.) - */ - if (isCommit) - pgStatXactCommit++; - else - pgStatXactRollback++; + /* Don't count parallel worker transaction stats */ + if (!parallel) + { + /* + * Count transaction commit or abort. (We use counters, not just + * bools, in case the reporting message isn't sent right away.) + */ + if (isCommit) + pgStatXactCommit++; + else + pgStatXactRollback++; + } /* * Transfer transactional insert/update counts into the base tabstat diff --git a/src/include/pgstat.h b/src/include/pgstat.h index be2f59239bf..19d75ccdda1 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1324,7 +1324,7 @@ extern void pgstat_init_function_usage(FunctionCallInfoData *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);