mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-04 17:07:22 +02:00
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 commitd42358efb
. I've not added a regression test for this; we tried to add one ind42358efb
, and had to revert it because it was too timing-sensitive for the buildfarm. Back-patch to 9.5 whered42358efb
came in. Stas Kelvich Discussion: <EB57BF68-C06D-4737-BDDC-4BA778F4E62B@postgrespro.ru>
This commit is contained in:
parent
3217ac3a98
commit
3cd504254f
@ -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_updated += rec->tuples_updated;
|
||||||
pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted;
|
pgstat_info->t_counts.t_tuples_deleted += rec->tuples_deleted;
|
||||||
pgstat_info->t_counts.t_truncated = rec->t_truncated;
|
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 +=
|
pgstat_info->t_counts.t_delta_live_tuples +=
|
||||||
rec->tuples_inserted - rec->tuples_deleted;
|
rec->tuples_inserted - rec->tuples_deleted;
|
||||||
pgstat_info->t_counts.t_delta_dead_tuples +=
|
pgstat_info->t_counts.t_delta_dead_tuples +=
|
||||||
|
Loading…
Reference in New Issue
Block a user