]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid counting transaction stats for parallel worker cooperating
authorAmit Kapila <akapila@postgresql.org>
Wed, 10 Apr 2019 03:06:42 +0000 (08:36 +0530)
committerAmit Kapila <akapila@postgresql.org>
Wed, 10 Apr 2019 03:06:42 +0000 (08:36 +0530)
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
src/backend/access/transam/xact.c
src/backend/postmaster/pgstat.c
src/include/pgstat.h

index 349d94a5e67739b0569f6c2aea3b1cb3cdeb99e5..2af0832e500f4d930c98416f2818d3f5f054e2a0 100644 (file)
@@ -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.
index 4cf5ffeedb42bf51047c5edbc7f5e9a00e901923..c97862e7dc3cebcfe6e2b0dfc7a3b933ad3c9d06 100644 (file)
@@ -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);
        }
index b8bad60a3054399b5140892c6e3710a90f5e82fa..9a3864f0b0bb55c85857325a8aa0c9df2ba33f7e 100644 (file)
@@ -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
index be2f59239bf9d7e7512cffedb6ab8e0f838da103..19d75ccdda194ae96b2df96f423d4bf7441968fa 100644 (file)
@@ -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);