postgres.git / summary / log / commit / refs

commit    3cd504254f604a37adefc2bd9d43a0a6041463fd
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Thu Oct 13 23:45:58 2016 +0000

    Fix handling of pgstat counters for TRUNCATE in a prepared transaction.
    
    pgstat_twophase_postcommit is supposed to duplicate the math in
    AtEOXact_PgStat, but it had missed out the bit about clearing
    t_delta_live_tuples/t_delta_dead_tuples for a TRUNCATE.
    
    It's harder than you might think to replicate the issue here, because
    those counters would only be nonzero when a previous transaction in
    the same backend had added/deleted tuples in the truncated table,
    and those counts hadn't been sent to the stats collector yet.
    
    Evident oversight in commit d42358efb.  I've not added a regression
    test for this; we tried to add one in d42358efb, and had to revert it
    because it was too timing-sensitive for the buildfarm.
    
    Back-patch to 9.5 where d42358efb came in.
    
    Stas Kelvich
    
    Discussion: <EB57BF68-C06D-4737-BDDC-4BA778F4E62B@postgrespro.ru>


src/backend/postmaster/pgstat.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 0440f4a1d45..8f5e90be2a9 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2227,7 +2227,12 @@ pgstat_twophase_postcommit(TransactionId xid, uint16 info, pgstat_info->t_counts.t_tuples_updated += rec->tuples_updated; pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted; pgstat_info->t_counts.t_truncated = rec->t_truncated; - + if (rec->t_truncated) + { + /* forget live/dead stats seen by backend thus far */ + pgstat_info->t_counts.t_delta_live_tuples = 0; + pgstat_info->t_counts.t_delta_dead_tuples = 0; + } pgstat_info->t_counts.t_delta_live_tuples += rec->tuples_inserted - rec->tuples_deleted; pgstat_info->t_counts.t_delta_dead_tuples += [parent: 3217ac3a9867]