postgres.git / summary / log / commit / refs

commit    7657072e0ccc01955fddfce22ffcc4d82f9e9e45
Author:   Amit Kapila <akapila@postgresql.org>
Date:     Wed Apr 10 03:17:39 2019 +0000
First released in: 12.0, 9.6.13, 10.8, 11.3

    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


src/backend/access/transam/twophase.c | 2 +- src/backend/access/transam/xact.c | 4 ++-- src/backend/postmaster/pgstat.c | 22 +++++++++++++--------- src/include/pgstat.h | 2 +- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 29ae6b4ba94..74e75a853de 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1506,7 +1506,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 30e1539fcec..3bfa64d02f1 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -2165,7 +2165,7 @@ CommitTransaction(void) AtEOXact_Files(); 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); @@ -2657,7 +2657,7 @@ AbortTransaction(void) AtEOXact_Files(); 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 ac658dcb241..98348d8aad4 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 cb05d9b81e5..06e6d670c57 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1299,7 +1299,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); [parent: 4c9e545724c6]