agora inbox for [email protected]
help / color / mirror / Atom feedFrom: Andres Freund <[email protected]>
Subject: [PATCH v60 08/17] pgstat: Introduce pgstat_relation_should_count().
Date: Sat, 3 Apr 2021 21:30:01 -0700
---
src/include/pgstat.h | 22 +++++++----
src/include/utils/rel.h | 1 +
src/backend/access/common/relation.c | 4 +-
src/backend/catalog/index.c | 2 +-
src/backend/postmaster/pgstat.c | 59 +++++++++++++++++-----------
5 files changed, 53 insertions(+), 35 deletions(-)
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 291e5ab1698..a34bb328e60 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -1030,43 +1030,49 @@ extern void pgstat_initialize(void);
extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id);
extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id);
-extern void pgstat_initstats(Relation rel);
+extern void pgstat_relation_init(Relation rel);
+extern void pgstat_relation_assoc(Relation rel);
+
+#define pgstat_relation_should_count(rel) \
+ (likely((rel)->pgstat_info != NULL) ? true : \
+ ((rel)->pgstat_enabled ? pgstat_relation_assoc(rel), true : false))
+
/* 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) \
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 9a3a03e5207..e032612d39f 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -234,6 +234,7 @@ typedef struct RelationData
Oid rd_toastoid; /* Real TOAST table's OID, or InvalidOid */
/* use "struct" here to avoid needing to include pgstat.h: */
+ bool pgstat_enabled;
struct PgStat_TableStatus *pgstat_info; /* statistics collection area */
} RelationData;
diff --git a/src/backend/access/common/relation.c b/src/backend/access/common/relation.c
index 632d13c1eaf..3721bad1daf 100644
--- a/src/backend/access/common/relation.c
+++ b/src/backend/access/common/relation.c
@@ -73,7 +73,7 @@ relation_open(Oid relationId, LOCKMODE lockmode)
if (RelationUsesLocalBuffers(r))
MyXactFlags |= XACT_FLAGS_ACCESSEDTEMPNAMESPACE;
- pgstat_initstats(r);
+ pgstat_relation_init(r);
return r;
}
@@ -123,7 +123,7 @@ try_relation_open(Oid relationId, LOCKMODE lockmode)
if (RelationUsesLocalBuffers(r))
MyXactFlags |= XACT_FLAGS_ACCESSEDTEMPNAMESPACE;
- pgstat_initstats(r);
+ pgstat_relation_init(r);
return r;
}
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index a628b3281ce..7c5c2093328 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1877,7 +1877,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 bf93d0cd55e..6c4ba9932de 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -183,7 +183,7 @@ static bool pgStatRunningInCollector = false;
* for the life of the backend. Also, we zero out the t_id fields of the
* contained PgStat_TableStatus structs whenever they are not actively in use.
* This allows relcache pgstat_info pointers to be treated as long-lived data,
- * avoiding repeated searches in pgstat_initstats() when a relation is
+ * avoiding repeated searches in pgstat_relation_assoc() when a relation is
* repeatedly opened during a transaction.
*/
#define TABSTAT_QUANTUM 100 /* we alloc this many at a time */
@@ -1617,7 +1617,7 @@ pgstat_report_analyze(Relation rel,
* collector ends up with the right numbers if we abort instead of
* committing.)
*/
- if (rel->pgstat_info != NULL)
+ if (pgstat_relation_should_count(rel))
{
PgStat_TableXactStatus *trans;
@@ -1943,7 +1943,7 @@ pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize)
/* ----------
- * pgstat_initstats() -
+ * pgstat_relation_init() -
*
* Initialize a relcache entry to count access statistics.
* Called whenever a relation is opened.
@@ -1955,7 +1955,7 @@ pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize)
* ----------
*/
void
-pgstat_initstats(Relation rel)
+pgstat_relation_init(Relation rel)
{
Oid rel_id = rel->rd_id;
char relkind = rel->rd_rel->relkind;
@@ -1963,6 +1963,7 @@ pgstat_initstats(Relation rel)
/* We only count stats for things that have storage */
if (!RELKIND_HAS_STORAGE(relkind))
{
+ rel->pgstat_enabled = false;
rel->pgstat_info = NULL;
return;
}
@@ -1970,6 +1971,7 @@ pgstat_initstats(Relation rel)
if (pgStatSock == PGINVALID_SOCKET || !pgstat_track_counts)
{
/* We're not counting at all */
+ rel->pgstat_enabled = false;
rel->pgstat_info = NULL;
return;
}
@@ -1978,11 +1980,22 @@ pgstat_initstats(Relation rel)
* If we already set up this relation in the current transaction, nothing
* to do.
*/
- if (rel->pgstat_info != NULL &&
+ if (rel->pgstat_info &&
rel->pgstat_info->t_id == rel_id)
return;
- /* Else find or make the PgStat_TableStatus entry, and update link */
+ rel->pgstat_enabled = true;
+}
+
+void
+pgstat_relation_assoc(Relation rel)
+{
+ Oid rel_id = rel->rd_id;
+
+ Assert(rel->pgstat_enabled);
+ Assert(rel->pgstat_info == NULL);
+
+ /* find or make the PgStat_TableStatus entry, and update link */
rel->pgstat_info = get_tabstat_entry(rel_id, rel->rd_rel->relisshared);
}
@@ -2149,13 +2162,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);
@@ -2170,13 +2182,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);
@@ -2195,13 +2206,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);
@@ -2253,13 +2263,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);
@@ -2282,10 +2291,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;
+ }
}
/*
--
2.31.0.121.g9198c13e34
--zefjd6adjk3g4ecc
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v60-0009-pgstat-xact-level-cleanups-consolidation.patch"
view thread (9+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH v60 08/17] pgstat: Introduce pgstat_relation_should_count().
In-Reply-To: <no-message-id-1863520@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox