From 8363102009d8ee64255ad4948183f9d159eb8f4b Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 20 Mar 2022 19:12:09 -0700 Subject: [PATCH] pgstat: introduce pgstat_relation_should_count(). A later commit will make the check more complicated than the current (rel)->pgstat_info != NULL. It also just seems nicer to have a central copy of the logic, even while still simple. Author: Andres Freund Discussion: https://postgr.es/m/20220303021600.hs34ghqcw6zcokdh@alap3.anarazel.de --- src/backend/catalog/index.c | 2 +- src/backend/postmaster/pgstat.c | 36 ++++++++++++++++----------------- src/include/pgstat.h | 17 +++++++++------- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index e43117ffefe..dd715ca0609 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -1743,7 +1743,7 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName) tabentry = pgstat_fetch_stat_tabentry(oldIndexId); if (tabentry) { - if (newClassRel->pgstat_info) + if (pgstat_relation_should_count(newClassRel)) { newClassRel->pgstat_info->t_counts.t_numscans = tabentry->numscans; newClassRel->pgstat_info->t_counts.t_tuples_returned = tabentry->tuples_returned; diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index e74a66d743a..62411313af0 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -1709,7 +1709,7 @@ pgstat_report_analyze(Relation rel, * * Waste no time on partitioned tables, though. */ - if (rel->pgstat_info != NULL && + if (pgstat_relation_should_count(rel) && rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) { PgStat_TableXactStatus *trans; @@ -2359,13 +2359,12 @@ add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level) void pgstat_count_heap_insert(Relation rel, PgStat_Counter n) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2380,13 +2379,12 @@ pgstat_count_heap_insert(Relation rel, PgStat_Counter n) void pgstat_count_heap_update(Relation rel, bool hot) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2405,13 +2403,12 @@ pgstat_count_heap_update(Relation rel, bool hot) void pgstat_count_heap_delete(Relation rel) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2463,13 +2460,12 @@ pgstat_truncdrop_restore_counters(PgStat_TableXactStatus *trans) void pgstat_count_truncate(Relation rel) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) + if (pgstat_relation_should_count(rel)) { - /* We have to log the effect at the proper transactional level */ + PgStat_TableStatus *pgstat_info = rel->pgstat_info; int nest_level = GetCurrentTransactionNestLevel(); + /* We have to log the effect at the proper transactional level */ if (pgstat_info->trans == NULL || pgstat_info->trans->nest_level != nest_level) add_tabstat_xact_level(pgstat_info, nest_level); @@ -2492,10 +2488,12 @@ pgstat_count_truncate(Relation rel) void pgstat_update_heap_dead_tuples(Relation rel, int delta) { - PgStat_TableStatus *pgstat_info = rel->pgstat_info; + if (pgstat_relation_should_count(rel)) + { + PgStat_TableStatus *pgstat_info = rel->pgstat_info; - if (pgstat_info != NULL) pgstat_info->t_counts.t_delta_dead_tuples -= delta; + } } /* diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 95f595353dc..3499c86dbfe 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -1104,41 +1104,44 @@ extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); extern void pgstat_initstats(Relation rel); +#define pgstat_relation_should_count(rel) \ + (likely((rel)->pgstat_info != NULL)) + /* nontransactional event counts are simple enough to inline */ #define pgstat_count_heap_scan(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_numscans++; \ } while (0) #define pgstat_count_heap_getnext(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_returned++; \ } while (0) #define pgstat_count_heap_fetch(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_fetched++; \ } while (0) #define pgstat_count_index_scan(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_numscans++; \ } while (0) #define pgstat_count_index_tuples(rel, n) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_tuples_returned += (n); \ } while (0) #define pgstat_count_buffer_read(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_blocks_fetched++; \ } while (0) #define pgstat_count_buffer_hit(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_relation_should_count(rel)) \ (rel)->pgstat_info->t_counts.t_blocks_hit++; \ } while (0) #define pgstat_count_buffer_read_time(n) \